1

数学の問題をシミュレーションするために、acプログラムをmatlabに移植しています。すべてのコードをmatlabで書き直しましたが、1つのループで時間がかかりすぎることがわかりました。forステートメントを使用する代わりに以下を計算するより良い方法があるかどうかわかりません

構造内に約1000個の行列(すべて同じ次元)が定義されています

A {1} = matrix1 A {2} = matrix2 ... A {1000} = matrix1000

Bは、A{n}と同じ次元の定数行列です。

A {n}とBの要素ごとの生成を計算し、結果のすべての要素の合計を次のように返します。

for k=1:1000
  AllSum(k) = sum(sum(A{k}.*B))
end

Aのサイズはパラメータによって異なります。通常のサイズは300x300です。上記のループを1回実行すると、速度は問題ありません。ただし、そのループは何度も呼び出される別のブロック内で実行されるため、すべての合計を見つけるのに非常に長い時間がかかります。それを後押しする方法はあるのだろうか。ありがとう

4

2 に答える 2

1

A特定のケースでは、最初にすべての行列の合計を計算してから、を掛けることができますB。セル配列として定義する代わりにA、それらを1つの3D配列として定義します:(私はこれに@SeçkinSavaşçıと同意します)

A(:,:,i) = ...

それ以外の:

A{i} = ...

B次に、合計して:を掛けます。

result = sum(A,3).* B;
于 2012-05-20T09:08:46.137 に答える
1

セルの代わりに3Dマトリックスを使用する必要があることに同意しました。

製品の合計はあなたに何を思い出させますか?ドット積。一連のドット積は何を思い出させますか?ベクトル行列の乗算。したがって、必要なのは、行列の各列が1つのラップされていないA {k}になり、B行ベクトルがラップされていないB行列になるように、データの形状を変更することです。つまり、AとBが2Dであるという事実は、計算とは無関係です。

A(:,:,k) = A{k}Aを推奨どおりに変換する場合は、次のようにします。

vec = B(:).';
mtx = reshape(A, size(A,1)*size(A,2), size(A,3));
AllSum = vec*mtx;
于 2012-05-21T13:48:49.903 に答える