2016-07-12 10 views
0

私は3D MATLAB関数を持っています。MATLAB 3D配列の各スライスを別の数で分割する

行列の各スライスに異なる数を掛けたいとします。

Iは、以下のコード例ではbsxfunことによってこれを実現しようとした:私は「A」の第4 * 3スライスは2で乗算されることを意図

a=randi(10,4,3,2); 
b=[2 3]; 
c=bsxfun(@times,a,b) 

、及び第4 * 3スライス「A」のしかし、私は次のエラーまし3.

を掛けすることになります。

を??? ==> bsxfun 2つの入力配列の非シングルトン次元が互いに一致する必要があります。

ループを使用しないでこの問題を解決するにはどうすればよいですか?

答えて

3

エラーが示すように、ベクトルと行列の次元を一致させる必要があります。 bは行ベクトルなので、行列のスライスを列にすることができます。あなたはpermuteでこれを行うことができます。

a = randi(10, 4, 3, 2); 
b = [2 3]; 
ap = permute(a, [1 3 2]); 
c = bsxfun(@times, ap, b) 

その後、戻って正しい形状に結果行列を得るために、あなたは再び入れ替えする必要があります。正しい順列の順番(これは同じ場合もあります。つまり、[1 3 2])、またはipermute(逆の順列)を使用して、それを把握することができます。 permuteより前に与えたのと同じ置換順序を付けてください。私たちは変化しなかったことから、この場合、

a = randi(10, 4, 3, 2); 
b = [2 3]; 
bp = permute(b, [1 3 2]); 
c = bsxfun(@times, a, bp) 

c = ipermute(c, [1 3 2]); 

また、あなたはそれが第三次元に拡張することによって、スライスを乗算する権利形状になるように、ベクトルbを並べ替えることができますa、正しい形状を得るためにcを再度並べ替える必要はありません。

関連する問題