10

C++ で非常に大きな行列 (11300x21500) の逆数を計算しようとしています。これまでに Eigen と Armadillo ライブラリを試しましたが、どちらも初期化段階で失敗し、十分なメモリがないと言って失敗しました。この状況を打破する方法はありますか?

前もって感謝します

PS
マトリックスのサイズを 21500x21500 に修正する必要があります。UmNyobe が示唆したように、これは正方行列ではありません。これは実際には観測行列Xであり、( X T X ) -1を計算しようとしています。

私は 8GB のメモリ (64 ビット システム) を持っていますが、このメモリ空間のすべてを利用しているとは思いません。タスクマネージャーを見ると、エラー時のメモリ使用量は1GBと表示されています。Windows7 には、メモリ使用量が 1GB を超えるとアプリケーションを終了する OS コマンドが存在する可能性があります。

ところで、私の本来の目的は、この観測行列に対して回帰を実行することです。

もう 1 つ: 観測行列 X の各行のほとんどの列はゼロです。これを利用して、反転操作でのメモリ使用量を制限する方法はありますか?

4

5 に答える 5

6

行列正方形であると仮定すると、おそらく探しているのはインプレース行列反転アルゴリズムです。

これをチェックしてください。

于 2012-05-09T22:35:31.880 に答える
5

(11300 x 11300)整数 (32 ビット) の行列を仮定すると、

4*(11300^2)/(1024^3) = 0.4757 GB

倍精度を使用している場合は、この数値を 2 倍にします。

ライブラリが Strassen アルゴリズムを使用している場合は、同じ大きさのメモリを追加する必要があるため、前の数値を 2 倍にします。

したがって、このサイズの double ベースの行列を Strassen または gaussian で反転すると、1.9 GB のコストがかかります。

于 2012-05-09T22:51:45.440 に答える
5

非正方行列を逆にすることはできません。

http://en.wikipedia.org/wiki/Invertible_matrix

于 2012-05-09T22:33:57.670 に答える
2

別の解決策を提案したいと思います。これは、行列自体の逆数に興味がなく、逆数とベクトルの積に興味がある場合にのみ機能します。vたとえば、ベクトルの逆数の積、つまりを求めたいとしますw := (X^T X)^{-1} v。この場合、実際に問題の解決策を探しています

Find w such that (X^T X) w = v

反復アルゴリズムを使用すると、を反転せずに上記の式でw与えられたXとを見つけることができます。私の頭に浮かぶ1つの可能性は、共役勾配法を使用することです。このアルゴリズムは、およそ 10 行で実装でき、指定された vector との積を計算できることだけが必要です。私たちの場合、これは 2 つのステップ、つまり計算と 2 番目のステップで行うこともできます。これにより、製品を保存する必要がないため、スペースを節約できます。v X(X^T X) yyz := X yX^T zX^T X

于 2012-07-31T13:39:43.303 に答える
0

64 ビット マシンでプログラムをコンパイルしていますが、正しい 64 ビット ライブラリを使用していることも確認する必要があります。そうしないと、プログラムが 32 ビットでコンパイルされ、同じメモリの問題が発生する可能性があります。

逆の計算に関しては、OpenCV の逆関数が役立つかもしれません。DECOMP_SVD 逆を使用するようにしてください。特異行列に近い場合により効果的であることがわかりました。

于 2013-07-21T09:40:15.590 に答える