У меня есть 3 матрицы, которые все разрежены: A
, B
и C
.
Мне нужно взять матричное произведение AB
, что приводит к плотной матрице. После этого мне нужно элементное произведение AB (элементное *) C. C является разреженным, и поэтому поэлементное умножение обнулит большую часть плотного произведения AB
, что снова приведет к разреженной матрице.
Зная это, я пытаюсь выяснить, как не материализовать все плотные компоненты AB.
Если C_ {i, J} равно 0, то я не должен материализовать AB_ {Я, J}. Это означает, что я могу пропустить скалярное произведение A_ {row i} и B_ {col j}. Но, кажется, очень неэффективно писать для l oop над строками A, чтобы выбрать строки, которые я хочу материализовать.
Может ли быть другой способ сделать это умножение разумно?
Вот пример генератора данных в R, хотя реальный продукт AB, который у меня есть, более плотный, чем этот генератор. FWIW помощь от любого языка программирования была бы полезна, не обязательно R. (Эйген был бы великолепен, хотя!)
require(Matrix)
n = 10000
p = 100
A = rsparsematrix(n, p, .1)
B = rsparsematrix(p, p, .1)
C = rsparsematrix(n, p, .1)