1

サイズ(M)= 15000の値のdouble Mの配列があります

コマンド diag(M) を使用して、この配列を対角行列に変換する必要があります。

しかし、私は有名なエラーを受け取りますout of memory

オプション -nojvm を指定して matlab を実行し、メモリ領域を確保します

Windowsのoptin 3GBスイッチを使用

配列を倍精度に変換しようとしました

しかし、問題は解決しません

他のアイデアはありますか?

4

3 に答える 3

3

完全な対角行列 (非常にまばらになります) を生成するよりも、おそらくやろうとしていることを実行するためのはるかに優れた方法があります。

2 億 2500 万の要素を持つ行列に他の行列を掛けると、非常に長い時間がかかります。

アルゴリズムを再構築して、次の事実を利用することをお勧めします。

diag(M)(a, b) =
                   M(a)    | a == b
                   0       | a != b

時間とメモリを大幅に節約でき、お金を払ってくれる人は誰でも幸せになります。

対角行列は次のようになります。

行列の対角線に沿ったもの (行インデックスが列インデックスと等しいもの)を除くすべてのエントリはゼロです。この例を提供された値に関連付けますdiag(M) = AM(n) = An

于 2013-06-06T20:21:40.093 に答える
2

サパース行列を使用する

 M = spdiags( M, 0, numel(M), numel(M) );

詳細については、一般的なスパース行列spdiagsに関するmatlab doc を参照してください。

于 2013-06-06T20:34:02.010 に答える