首页 > 解决方案 > octave如何创建稀疏子矩阵

问题描述

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)代码

标签: pythonfortranoctavesparse-matrix

解决方案


您正在索引一个稀疏矩阵,因此您需要查看Sparse 类,它是 C++ 中 liboctave 的一部分。您似乎正在寻找的方法是Sparse<T> Sparse<T>::index (const idx_vector& idx_i, const idx_vector& idx_j, bool resize_ok).

如果您打算在另一个程序上使用该实现,请注意代码的许可证是 GPLv3+。


推荐阅读