Эффективная альтернатива Outer для разреженных массивов в Mathematica?

Предположим, у меня есть два очень больших списка {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[%]

и т. Д. Не только необработанные промежуточные результаты Внешнего (списки разреженных массивов) крайне неэффективны, Внешний , похоже, потребляет слишком много памяти во время самих вычислений.

8
задан groovybaby 22 December 2011 в 19:33
поделиться