我有非常稀疏的大矩阵A
(A
是一个压缩的行存储)
我想对矩阵执行一些计算B = A^T * A
。但是B
也应该稀疏,因为A
的稀疏性。
如何计算B
的"掩码"?"掩码"是压缩行存储的列索引和行偏移量。
我看到的唯一方法是遍历嵌套循环中的行(通过 i 和 j),如果 A 的行 i 和 j 至少有一个公共非零列,则检查 B 的 (i, j) 元素是否为非零。但我认为很慢。
PS对不起我的英语不好
我认为你可以在O(n^2)
中做到这一点,矩阵A
中非零元素的数量n
.
考虑Bij=sum Aki*Akj
,Bij
如果存在具有 Aki
和 Akj
- 非零的k
,则只能是非零。
遍历A
的所有非零元素和A = Ak
k
行的非零元素(连续访问,行中的一个元素接一个,我假设压缩行存储 (crs) - 对于 ccs,您需要迭代列)产生以下算法:
for (k, i) in indices(nonzero(A)):
for j in indices(nonzero(Ak)):
Bij=nonzero
由于 for 循环只需要按行顺序接触A
的非零元素(这是至关重要的!),并且操作Bij=nonzero
成本O(1)
,如果您使用例如哈希集或布尔字段,则生成的运行时间必须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]
我不确定它与您的方法有何不同,但如果您没有关于矩阵A
形式的其他信息,我认为没有比这更快的东西了.