2016-07-07 14 views
2

I有するベクトルによって3次元アレイの各2D断面を乗算する次のコードスニペット:高速化3Dアレイ乗算

A = zeros(N,M); 
for k = 1:M 
    B = C(:,:,k); 
    A(:,k) = B * f(:,k); 
end 

私は参照コードをプロファイルする場合、そのNため= 200、M = 25これはかなり遅くなる可能性があります(コードの他の部分と比べて)。特に、行:

B=C(:,:,k) 

は、合計ランタイムの大部分を占めることがあります。これをスピードアップできる方法はありますか?

+0

実行可能コードを投稿してください。 'C'、' f'とは何ですか? –

+0

CはNxNxMアレイ、fはNxMアレイ –

答えて

0

permuteと組み合わせてbsxfunを使用して、シングルトン拡張で必要な乗算を実行し、適切な次元に沿って加算して行列乗算を計算することができます。

A = zeros(N,M); 
for k = 1:M 
    B = C(:,:,k); 
    A(:,k) = B * f(:,k); 
end 
result./A 

を与える:ループを使用して計算結果と比較し、その結果をチェックとして

result = permute(sum(bsxfun(@times, C, permute(f,[3 1 2])),2), [1 3 2]); 

として計算さ

N = 5; 
M = 4; 
C = rand(N,N,M); 
f = rand(N,M); 

例えばデータを定義

ans = 
    1  1  1  1 
    1  1  1  1 
    1  1  1  1 
    1  1  1  1 
    1  1  1  1 
+1

このソリューションではさらに多くの操作がありますが、この方法が高速になるとは思いません。 – obchardon

+1

@obchardon基本的な乗算と加算の回数は同じだと思います。しかし、はい、それはゆっくり、特に 'permute'のために遅くなるかもしれません –

+0

私は私の問題でそれをテストしました。 N = 192、M = 25の場合、少し遅くなります。 –