octave如何创建稀疏子矩阵
How does octave create a sparse submatrix
Octave 的一个奇妙特性是它处理稀疏矩阵的方式。我被赋予了将一些 Octave 代码复制到 Fortran 中的任务(速度很关键),具体来说,给定一个稀疏矩阵 Sparse(nodes,nodes),我需要提出子矩阵 SubSparse(afew,afew):
r=4;c=6;k=5;nz=r*k;
Sparse=spalloc(r,c,nz);
Sparse(1,1)=1;Sparse(1,2)=2;Sparse(3,5)=4;Sparse(4,6)=6;
SubSparse=Sparse([1,4],[1,6])
完整的矩阵是:
Sparse
1.000 2.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 4.000 0.000
0.000 0.000 0.000 0.000 0.000 6.000
SubSparse
1.000 0.000
0.000 6.000
我不能做的一件事是重新创建完整的矩阵,因为它们太大而无法放入机器中。
在我的稀疏矩阵 Fortran 实现中,我使用 Hartwell-Boeing 存储,这是由我使用 SuperLU 求解线性系统决定的。我相信 Octave 的压缩列格式非常相似。
我的问题是在哪里可以找到 (a) 执行 MWE 的第 4 行时发生的事情背后的逻辑和 (b) 代码
您正在为稀疏矩阵编制索引,因此您需要查看 Sparse class which is part of liboctave which is in C++. The method you seem to be looking for is Sparse<T> Sparse<T>::index (const idx_vector& idx_i, const idx_vector& idx_j, bool resize_ok)
。
如果您计划在另一个程序上使用该实现,请注意代码的许可证是 GPLv3+。
Octave 的一个奇妙特性是它处理稀疏矩阵的方式。我被赋予了将一些 Octave 代码复制到 Fortran 中的任务(速度很关键),具体来说,给定一个稀疏矩阵 Sparse(nodes,nodes),我需要提出子矩阵 SubSparse(afew,afew):
r=4;c=6;k=5;nz=r*k;
Sparse=spalloc(r,c,nz);
Sparse(1,1)=1;Sparse(1,2)=2;Sparse(3,5)=4;Sparse(4,6)=6;
SubSparse=Sparse([1,4],[1,6])
完整的矩阵是:
Sparse
1.000 2.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 0.000 0.000
0.000 0.000 0.000 0.000 4.000 0.000
0.000 0.000 0.000 0.000 0.000 6.000
SubSparse
1.000 0.000
0.000 6.000
我不能做的一件事是重新创建完整的矩阵,因为它们太大而无法放入机器中。
在我的稀疏矩阵 Fortran 实现中,我使用 Hartwell-Boeing 存储,这是由我使用 SuperLU 求解线性系统决定的。我相信 Octave 的压缩列格式非常相似。
我的问题是在哪里可以找到 (a) 执行 MWE 的第 4 行时发生的事情背后的逻辑和 (b) 代码
您正在为稀疏矩阵编制索引,因此您需要查看 Sparse class which is part of liboctave which is in C++. The method you seem to be looking for is Sparse<T> Sparse<T>::index (const idx_vector& idx_i, const idx_vector& idx_j, bool resize_ok)
。
如果您计划在另一个程序上使用该实现,请注意代码的许可证是 GPLv3+。