2

4096x4096 疎行列のランクを計算する必要があり、C/C++ コードを使用しています。それを行ういくつかのライブラリ(Armadilloなど)を見つけましたが、遅すぎます(ほぼ5分)。

また、Matlab の 2 つのオープン ソース バージョン (Freemat と Octave) も試しましたが、スクリプトを使用してテストを実行しようとすると、どちらもクラッシュしました。

5分は大した時間じゃないけど、100万のマトリックスみたいなものからランクを上げないといけないから、早ければ早いほどいい。

ランク計算用の高速ライブラリを知っている人はいますか?

4

3 に答える 3

1

次のコードを試してください (ドキュメントはこちら)。これは、Eigen ライブラリを使用して行列 A のランクを計算する例です。

MatrixXd A(2,2);
A << 1 , 0, 1, 0;
FullPivLU<MatrixXd> luA(A);
int rank = luA.rank();
于 2013-10-08T19:25:28.080 に答える
1

Eigenライブラリはスパース行列をサポートしてます。試してみてください。

于 2012-07-04T18:21:03.807 に答える
1

代数ランクの計算は O(n^3) で、n は行列のサイズであるため、本質的に低速です。たとえば必要があります。ピボットを実行するには、行列が適切に条件付けされていない場合、これは遅く、不正確です (n = 4096 の場合、典型的な行列は非常に悪条件です)。

さて、ランクは?画像の寸法です。n が大きいと計算が非常に難しくなり、入力のわずかな数値の不正確さによって台無しになります。n = 4096 の場合、特によく条件付けされた行列がない限り、これにより、ピボット アルゴリズムで有用なことを行うことができなくなります。

実際、最善の方法は、カットオフ イプシロンを修正し、特異値 s_1 > ... > s_n を計算し、ランクとして sum(s_i^2, i > r) < epsilon^2 * sum となる最小の整数 r を取ることです。 (s_i^2)。

したがって、スパース SVD ルーチンが必要です。そこから。

これは速くはないかもしれませんが、少なくとも正しいでしょう。

物事をスピードアップするために必要な特異値を少なくするよう求めることができます。これは難しい問題であり、背景とこれらの行列をどのように取得したかについての情報がなければ、これ以上何もできません.

于 2012-07-04T18:28:03.580 に答える