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

How to find non-zero elements of matrix A^T * A where A is sparse (crs/ccs) matrix?

我有非常稀疏的大矩阵AA是一个compressed row storage

我想对 B = A^T * A 矩阵执行一些计算。但是 B 由于 A.

的稀疏性也应该是稀疏的

我如何计算 B 的 "mask"? "Mask"是压缩行存储的列索引和行偏移。

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

PS对不起我的英语不好

我想你可以在 O(n^2) 中做到这一点,其中 n - 矩阵中非零元素的数量 A.

考虑 Bij=sum Aki*Akj,如果存在 kAkiAkj - 非零,则 Bij 可能只有非零。

遍历 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),如果您使用 for例如哈希集或布尔字段,结果 运行 时间必须是 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