Предположим, у меня есть два очень больших списка {a1, a2,…} и {b1, b2,…}, где все ai и bj - большие разреженные массивы. Для экономии памяти я храню каждый список как один исчерпывающий разреженный массив.
Теперь я хотел бы вычислить некоторую функцию f на всех возможных парах ai и bj, где каждый результат f [ai, bj] снова является разреженным массивом. Между прочим, все эти разреженные массивы имеют одинаковые размеры.
Хотя
Flatten[Outer[f, {a1, a2, ...}, {b1, b2, ...}, 1], 1]
возвращает желаемый результат (в принципе), похоже, что он потребляет слишком много памяти. Не в последнюю очередь потому, что возвращаемое значение представляет собой список разреженных массивов, тогда как один исчерпывающий разреженный массив оказывается гораздо более эффективным в интересующих меня случаях.
Есть ли эффективная альтернатива описанному выше использованию Внешний
?
Более конкретный пример:
{SparseArray[{{1, 1, 1, 1} -> 1, {2, 2, 2, 2} -> 1}],
SparseArray[{{1, 1, 1, 2} -> 1, {2, 2, 2, 1} -> 1}],
SparseArray[{{1, 1, 2, 1} -> 1, {2, 2, 1, 2} -> 1}],
SparseArray[{{1, 1, 2, 2} -> -1, {2, 2, 1, 1} -> 1}],
SparseArray[{{1, 2, 1, 1} -> 1, {2, 1, 2, 2} -> 1}],
SparseArray[{{1, 2, 1, 2} -> 1, {2, 1, 2, 1} -> 1}],
SparseArray[{{1, 2, 2, 1} -> -1, {2, 1, 1, 2} -> 1}],
SparseArray[{{1, 2, 2, 2} -> 1, {2, 1, 1, 1} -> 1}]};
ByteCount[%]
list = SparseArray[%%]
ByteCount[%]
Flatten[Outer[Dot, list, list, 1], 1];
ByteCount[%]
list1x2 = SparseArray[%%]
ByteCount[%]
Flatten[Outer[Dot, list1x2, list, 1], 1];
ByteCount[%]
list1x3 = SparseArray[%%]
ByteCount[%]
и т. Д. Не только необработанные промежуточные результаты Внешнего
(списки разреженных массивов) крайне неэффективны, Внешний
, похоже, потребляет слишком много памяти во время самих вычислений.