如何直接对COO格式稀疏矩阵应用reverse_cuthill_mckee置换?
关于COO矩阵直接应用Reverse Cuthill-Mckee置换的问题
可以直接对COO格式的(I,J,V)应用RCM置换,但你操作时大概率搞反了置换的索引映射方向,才导致模式和预期差异明显。
核心问题:置换的索引映射方向搞反了
大部分稀疏矩阵库(比如SciPy)里的reverse_cuthill_mckee返回的置换数组perm,定义是置换后矩阵的第i行/列,对应原矩阵的第perm[i]行/列——也就是这是「新索引→原索引」的映射,而非你可能误以为的「原索引→新索引」。
如果直接把原COO的I、J替换成perm[I]、perm[J],相当于把原索引直接映射到新索引的位置,完全弄反了置换逻辑,自然得到的矩阵模式和CSR正确置换后的结果对不上。
正确的操作步骤
- 先从CSR矩阵计算得到RCM置换数组
perm - 计算逆置换
inv_perm,它的作用是把原索引映射到新索引:import numpy as np inv_perm = np.zeros_like(perm) inv_perm[perm] = np.arange(len(perm)) - 对COO的行、列索引应用逆置换:
I_rcm = inv_perm[I] J_rcm = inv_perm[J] V_rcm = V # 元素值不需要改变 - 用
(I_rcm, J_rcm, V_rcm)构造的COO矩阵,模式就会和CSR通过csr_matrix[:, perm][perm, :]得到的置换矩阵完全一致(元素顺序可能不同,但非零元的位置分布完全匹配)
验证逻辑
置换矩阵的本质是A_rcm = P @ A @ P^T,其中P是置换矩阵。逆置换inv_perm正好对应P的映射关系:原矩阵中(x,y)位置的元素,会被映射到新矩阵的(inv_perm[x], inv_perm[y])位置,这和CSR按perm重排行列的操作完全等价。
内容的提问来源于stack exchange,提问作者Cesare
相关产品推荐
相关产品推荐

