次元の違う配列の乗算について

12 views (last 30 days)
osamu
osamu on 6 Jul 2023
Edited: Kenjiro Sugimoto on 7 Jul 2023
M×N×Aの配列に対して、M×Nの配列を各Aの要素毎に乗算する方法を教えてください。
例えばX1=randi(100,[3,3,10])とC = [1 1 1; 2 2 2; 3 3 3];を用意してfor文を使った場合
n=size(X1,3);
for i=1:n
X2(:,:,i)=X1(:,:,i).*C;
end
とすれば一応計算できますが、配列のサイズが大きくなるとfor文計算が非常に時間がかかってしまいます。
for文を使わずに計算する方法はありますでしょうか。
宜しくお願いします。

Accepted Answer

Kenjiro Sugimoto
Kenjiro Sugimoto on 6 Jul 2023
Edited: Kenjiro Sugimoto on 7 Jul 2023
少し拍子抜けする回答かもしれませんが、実はそのまま要素積「.*」することで所望の答えが得られます。
% サンプル配列
X1 = randi(100,[3,3,10]);
C = [1 1 1; 2 2 2; 3 3 3];
% ループによる方法
n = size(X1,3);
for i=1:n
X2(:,:,i) = X1(:,:,i).*C;
end
% 暗黙的な拡張
X3 = X1.*C;
isequal(X2,X3) % 1 (true)
これは「implicit expansion=暗黙的な拡張」という機能で R2016b から搭載されています。それ以前であれば bsxfun() 関数で同等の計算が可能です。以下、参考リンクです。

More Answers (1)

Akira Agata
Akira Agata on 6 Jul 2023
Edited: Akira Agata on 6 Jul 2023
配列 C を 3次元方向に繰り返して X1 とおなじサイズにすることで、ドット (.) による要素毎の乗算が可能です。
% サンプル配列
X1 = randi(100, [3, 3, 10]);
C = [1 1 1; 2 2 2; 3 3 3];
% C を3次元方向に繰り返して X1と同じサイズにする
n = size(X1, 3);
C2 = repmat(C, [1 1 n]);
% 要素毎の乗算
X2 = X1.*C2;
ちなみにページ単位の行列の積 ( X3(:, :, i) = X1(:, :, i)*C for i = 1...10) をするには pagemtimes 関数を使います。
% サンプル配列
X1 = randi(100, [3, 3, 10]);
C = [1 1 1; 2 2 2; 3 3 3];
% ページ毎の乗算
X3 = pagemtimes(X1, C);

Categories

Find more on クラスターの構成 in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!