Octave的奇妙功能之一是它如何处理稀疏矩阵。我已经完成了将一些Octave代码复制到fortran中的任务(速度至关重要),特别是,鉴于稀疏矩阵Sparse(节点,节点),我需要提出子矩阵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解决线性系统的要求所决定的。我相信八度的压缩列格式非常相似。
我的问题是,在哪里可以找到(a)执行MWE的第4行时发生的逻辑,以及(b)代码
答案 0 :(得分:2)
您正在索引稀疏矩阵,因此需要查看Sparse class,它是C ++中liboctave的一部分。您似乎要寻找的方法是Sparse<T> Sparse<T>::index (const idx_vector& idx_i, const idx_vector& idx_j, bool resize_ok)
。
如果您打算在另一个程序上使用该实现,请注意GPLv3 +代码的许可。