2016-07-19 9 views
1

私は256 x 3527 x 8の次元を持つ3D配列(画像)を持っています。 8のサイズ256 x 3527(の画像の各レイヤでMATLAB:1次元ベクトルによる3D配列の分割

Esun = [1 2 3 4 5 6 7 8] 

:私は例えば8

を通して1のベクトルによって3次元によってすべての値を分割したい、私のベクトルは、のように見えますレイヤー)、私はEsunのそれぞれの値で除算したいと思います。

MATLABにこのような機能がない場合、3Dアレイを8個にカットしてループで実行するか、Esunを3D繰り返し配列に変換して行列を分割する方が速いでしょうか?

答えて

1

それは基本的にループであるとしてarrayfunを使用しないでください。代わりにpermuteと組み合わせた強力なbsxfunを使用します。

Esun = 1:8; % Esun = [1 2 3 4 5 6 7 8]; 
B = bsxfun(@rdivide, A, permute(Esun, [1 3 2])); 

変数Aあなたはそれがサイズ256 x 3527 x 8である必要があり、3Dマトリックスです。 permuteへの呼び出しはEsunを使用し、1行1列の3Dベクトルに変換します。その後、bsxfunは3Dベクトルをサイズ256 x 3527 x 8の3Dマトリックスになるようにブロードキャストします。各スライスiは、i番目の値をEsunに表します。次に、要素ごとの除算を実行します。

これは基本的に、あなたが話している反復配列操作を実行しますが、複製は内部でbsxfunで実行され、繰り返し配列を最初に作成してから実行するよりも高速です。

+0

私はbsxfunを使用して少し読んできました。私は使用しているグラフィックスカードの種類がスピードに影響しますか? –

+0

いいえ、そうではありません。グラフィックスメモリは、 'gpuArray'sを使用している場合にMATLABでのみ使用され、nVidiaカードのみがサポートされています。それ以外の場合は、パフォーマンスに影響するCPUとRAMがほとんどです。 – rayryeng

+0

ああ、私はmathworksのページの定義を誤解していると思います。説明をありがとう。 –

0

次のようarrayfunを使用することができます。

c=arrayfun(@(i) X(:,:,i)*Esun(i),1:8,'UniformOutput',0); 

Xがあなたのイメージ配列であると仮定すると。上記では、MATLABは、あなたが新しい配列を取得するためにcat機能を使用することができ、1X8のセル配列を返します。

B = cat(3, c{:}); % cat all cell elements in 3-rd dim 
関連する問題