如何找到矩阵A ^ T * A的非零元素,其中A是稀疏的(crs / ccs)矩阵?

时间:2016-03-15 14:14:04

标签: algorithm linear-algebra sparse-matrix

我有一个非常稀疏的大矩阵AAcompressed row storage

我想在B = A^T * A矩阵上执行一些计算。但由于B的稀疏性,A也应该稀疏。

我如何计算"掩盖" B的? "面膜"是压缩行存储的列索引和行偏移。

我看到的唯一方法是在嵌套循环中迭代行(通过i和j)并且如果A的行i和j具有至少一个公共非,则检查B的元素(i,j)为非零零列。但我觉得很慢。

PS抱歉我的英语很差

1 个答案:

答案 0 :(得分:1)

我认为您可以使用O(n^2)n中执行此操作 - 矩阵A中的非零元素数量。

考虑Bij=sum Aki*Akj,如果Bij kAki非零,则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} }。