我想对称地排列一个稀疏矩阵,以同样的方式排列行和列。例如,我想旋转行和列,这需要:
1 2 3
0 1 0
0 0 1
到
^{pr2}$在Octave或MATLAB中,可以使用矩阵索引来简洁地执行此操作:
A = sparse([1 2 3; 0 1 0; 0 0 1]);
perm = [2 3 1];
Aperm = A(perm,perm);
我对在Python中使用NumPy/SciPy做这件事很感兴趣。下面是一个尝试:
#!/usr/bin/env python
import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 0, 1, 2])
col = np.array([0, 1, 2, 1, 2])
data = np.array([1, 2, 3, 1, 1])
A = csr_matrix((data, (row, col)), shape=(3, 3))
p = np.array([1, 2, 0])
#Aperm = A[p,p] # gives [1,1,1], the permuted diagonal
Aperm = A[:,p][p,:] # works, but more verbose
有没有更干净的方法来完成矩阵的这种对称排列?在
(我对简洁的语法比对性能更感兴趣)
在MATLAB中
是块操作。In
^{pr2}$numpy
A[perm,perm]
选择对角线上的元素。在是块索引。MATLAB对角线需要类似
sub2ind
的内容。一种语言简洁的语言在另一种语言中更为冗长实际上,},而{}针对{}在块的情况下。结果是}形状。在
numpy
在这两种情况下都使用相同的逻辑。它将一个索引“广播”到另一个索引,在对角情况下,(n,)
针对{(n,)
和{这种
numpy
索引也适用于稀疏矩阵,尽管速度不如它快。实际上,它使用矩阵乘法来完成这种索引-使用基于索引的“提取器”矩阵(可能是2,M*A*M.T
)。在MATLAB关于置换矩阵的文档:
https://www.mathworks.com/help/matlab/math/sparse-matrix-operations.html#f6-13070
相关问题 更多 >
编程相关推荐