0

疎な線形システムを解くために Octave C++ API を使用しようとしています。私が遭遇した問題は、スパース線形システムを構築する効率的な方法が見つからないことです。

SparseMatrix A;
int dim,nnz;
// dim = dimension
// nnz = number of non-zero entry in the matrix A

/*
    somehow assign the values for dim and nnz
*/

A = SparseMatrix ( dim, dim, nnz );

// row index array
int *pidx_r = new int[nnz];
// col index array
int *pidx_c = new int[nnz];
// value array
double *pval = new double[nnz];
// total number of nonzero elements
int tot; 

/*
    somehow assign values for pidx_r, pidx_c, pval and tot
*/

for ( int i = 0; i < tot; i++ )
    A ( pidx_r[i], pidx_c[i] ) = pval[i];

上記のコードは、非常に非効率的な私の素朴な実装を説明しており、スパース行列に値を大量に挿入するメンバー関数がいくつかあるはずです。

例えば、A=SparseMatrix(pidx_r,pidx_c,pval);

ただし、そのためのメンバー関数が見つかりません。少なくとも、素朴な実装が唯一のアプローチのようです。

何らかの形式で行列を用意したので、C++ 用の Octave API を使用して効率的に疎行列を作成する方法はありますか?

4

2 に答える 2

0

このチュートリアルを見つけたところです。最初の段落のメソッドは、探していたものと似ています。

リンク

于 2013-05-23T00:07:09.857 に答える
0

@wirew0rm​​ リンクに記載されている方法は簡単で非効率的です。

実際、継承されたメンバー SparseMatrixRep の内容を基本的に変更するソリューションを既に見つけています。

ドキュメントには安全ではなく推奨されないと記載されていますが、パフォーマンスは大幅に改善されています。

于 2013-05-24T14:08:13.307 に答える