MATLABコードを最適化する必要があります。コードはシンプルですが、計算ユニットの一部です。これは〜8000回(冗長なし)です(この計算単位は実際には10〜20K回使用されます)。 MATLABコード全体はかなり長くて複雑です(私のような物理学者にとって)、MATLABプロファイラでは、次のセグメントが実行時間のほぼ半分(!)を占めると主張しています。MATLAB行列要素の賢明な乗算の最適化
コードは基本的に3つのグループ(A、B、C)からの3つの行列のすべての置換を要素ごとに掛け合わせて、それをある重み付けで合計します。グループAには1つの行列があり、グループBには4つの行列があり、グループCには7があります。
私はいくつかのベクトル化手法を試みましたが、同じ実行時間が得られました。
MATLABプロファイラを使用して、各行で費やされた合計時間(8000回の呼び出しすべて)を確認しました。コメントに記述しました。
for idx_b = 1:4
B_MAT=B_Container_Cell{idx_b};
for idx_c = 1:7
C_MAT = C_Container_Cell{idx_b}(:,:,idx_c); % 60 sec
ACB=A_MAT.*C_MAT.*B_MAT; % 20 sec
Coeff_x = Coeff_x_Cell{idx_b}(p1,p2,idx_c,p3);
Coeff_y = Coeff_y_Cell{idx_b}(p1,p2,idx_c,p3);
Coeff_z = Coeff_z_Cell{idx_b}(p1,p2,idx_c,p3);
Sum_x = Sum_x+Coeff_x.*ACB; % 15 sec
Sum_y = Sum_y+Coeff_y.*ACB; % 15 sec
Sum_z = Sum_z+Coeff_z.*ACB; % 15 sec
end
端
いくつかの事前の知識 -
A_MATループ
B_MAT ouside定義された1024×1024複雑な二重定数行列であるが、1024×1024二重マトリックス、本質的に疎(のみ0と1の値、のものであるである〜5
C_MAT)全元素のうち%が1024×1024の複雑な二重
SUM_X/Sum_y/Sum_zが適切に開始されたある
Coeff_X/Coeff_y/Coeff_zダブルスカラー
P1、P2、P3は、パラメータ(このコード・セグメントの定数)は、ほとんどの消費操作は変数の割り当てである理由
誰もが知っていますしていますか? は(私が割り当てをスキップして、直接の表現でC_MATを交換しようとした、まだそれはパフォーマンス悪化)3を作成するための
ベクトル化私が試しtechiqueは猫を使用することです
は、再構築しようとrepmatを巨大な2次元行列は、要素ごとにそれらを乗算し、すべての要素を(変形して)お互いの上に置き、関連する次元を介して合計します。第1の行列は、Aが4×7 = 28回繰り返され、第2の行列が7回反復され、第3の行列は全てC行列(= 28行列)であった。
サンプル入力以下link上
のコードは、サンプル入力ファイルを生成します。これらの変数の実行時間は〜0.38秒です(元のコード+変数〜0.42、実際のCセルコンテナは非常に大きいので、抽出に時間がかかります)
は、 '*'の動作は、(*'行列乗算 'とは異なり)可換です。 –
@BenVoigtそれはあまりパフォーマンスを変更しません。 – Alexander
あなたの質問のベクトル化手法を参照してください。何を試しましたか? – BillBokeey