我有一个非常稀疏的大矩阵A
(A
是compressed row storage)
我想在B = A^T * A
矩阵上执行一些计算。但由于B
的稀疏性,A
也应该稀疏。
我如何计算"掩盖" B
的? "面膜"是压缩行存储的列索引和行偏移。
我看到的唯一方法是在嵌套循环中迭代行(通过i和j)并且如果A的行i和j具有至少一个公共非,则检查B的元素(i,j)为非零零列。但我觉得很慢。
PS抱歉我的英语很差
答案 0 :(得分:1)
我认为您可以使用O(n^2)
在n
中执行此操作 - 矩阵A
中的非零元素数量。
考虑Bij=sum Aki*Akj
,如果Bij
k
和Aki
非零,则Akj
可能只有非零值。
迭代A
的所有非零元素,并通过k
A = Ak
行的非零元素(连续访问,一行接一行,我假设压缩行存储(crs) - 对于ccs,你需要迭代列)产生以下算法:
for (k, i) in indices(nonzero(A)):
for j in indices(nonzero(Ak)):
Bij=nonzero
因为for循环只需按行顺序触摸A
的非零元素(这很关键!)而操作Bij=nonzero
需要花费O(1)
,如果你使用例如a哈希集或布尔字段,生成的运行时间必须为O(n^2)
。
使用A=[1,..,1; 0,..,0; ...; 0, ..,0]
即可以看到第一行非零元素的矩阵,确实存在最坏情况,需要n^2
次操作。
例如:
A=[1,1;0,0] -> A^T=[1,0;1,0]
B=A^t*A=[1,1;1,1]
我不确定它与您的方法有什么不同,但如果您没有关于矩阵形式的其他信息,我不会认为有更快的事情{{1} }。