4

これは私が解こうとしている方程式です:

h = (X'*X)^-1*X'*y

ここで、X は行列で、y はベクトルです ((X'X)^-1 は X 転置時間 X の逆数です)。これをMatlabで次のようにコーディングしました。

h = (X'*X)\X'*y

私は正しいと信じています。問題は、X が約 10000x10000 であり、その逆数を計算しようとすると、私が見つけることができる最も強力なコンピューター (16 コア、24GB RAM) でも Matlab がクラッシュすることです。これを分割する方法、またはそのような大規模な反転を行うために設計されたライブラリはありますか?

ありがとうございました。

4

4 に答える 4

1

それは疑似逆のように見えます。あなたはおそらくただ探していますか

h = X \ y;
于 2013-03-13T00:59:52.723 に答える
0

ランダムな 10,000 x 10,000 の行列 X とランダムな 10,000 x 1 のベクトル y を生成しました。

計算を段階的に分割しました。(以下にコードを示します)

  1. 転置を計算し、行列 K に保持します
  2. 次に、K に X を掛けて行列 A を計算しました。
  3. K にベクトル y を掛けて計算されたベクトル b
  4. 最後に、A と b にバックスラッシュ演算子を使用して解決しました

計算に問題はありませんでした。しばらく時間がかかりましたが、操作を可能な限り小さなグループに分割することで、コンピューターが圧倒されるのを防ぐことができました。ただし、使用しているマトリックスの構成 (スパース、小数など) である可能性があります。

X = randi(2000, [10000, 10000]);
y = randi(2000, 10000, 1);
K = X';
A = K*X;
b = K*y;
S = A\b;
于 2013-03-13T00:07:12.053 に答える
0

ジョーダン、あなたの方程式はまさに「ムーア・ペンローズ行列逆」の定義です。

チェック: http://mathworld.wolfram.com/Moore-PenroseMatrixInverse.html

直接使用h = X \ y;すると役立つはずです。またはMatlabを確認してくださいpinv(X)*y

于 2013-06-24T21:42:45.050 に答える
0

複数のマシンを自由にh = X\y使用でき、@Ben が提案する形式に問題を再キャストできる場合は、分散配列を使用できます。このデモでは、その方法を示します。

于 2013-03-13T08:22:03.223 に答える