組み込み関数bsxfun
は、役立つはずの高速ユーティリティです。次元が一致しない 2 つの入力に対して、要素ごとに 2 つの入力関数を実行するように設計されています。シングルトンの次元が拡張され、非シングルトンの次元が一致する必要があります。(紛らわしいように聞こえますが、一度理解すると、多くの点で役立ちます。)
あなたの問題を理解しているので、各ベクトルの次元形状を調整して、定義する必要がある次元を定義できます。次に、ネストされたbsxfun
呼び出しを使用して乗算を実行します。
コード例は次のとおりです。
%Some inputs, N-by-1 vectors
x = [1; 3; 9];
y = [1; 2; 4];
z = [1; 5];
%The computation you describe, using nested BSXFUN calls
bsxfun(@times, bsxfun(@times, ... %Nested BSX fun calls, 1 per dimension
x, ... % First argument, in dimension 1
permute(y,2:-1:1) ) , ... % Second argument, permuited to dimension 2
permute(z,3:-1:1) ) % Third argument, permuted to dimension 3
%Result
% ans(:,:,1) =
% 1 2 4
% 3 6 12
% 9 18 36
% ans(:,:,2) =
% 5 10 20
% 15 30 60
% 45 90 180
任意の数の次元を処理するには、再帰またはループ構成を使用してこれを拡張できます。ループは次のようになります。
allInputs = {[1; 3; 9], [1; 2; 4], [1; 5]};
accumulatedResult = allInputs {1};
for ix = 2:length(allInputs)
accumulatedResult = bsxfun(@times, ...
accumulatedResult, ...
permute(allInputs{ix},ix:-1:1));
end