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

조회 수: 16 (최근 30일)
osamu
osamu 2023년 7월 6일
편집: Kenjiro Sugimoto 2023년 7월 7일
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文を使わずに計算する方法はありますでしょうか。
宜しくお願いします。

채택된 답변

Kenjiro Sugimoto
Kenjiro Sugimoto 2023년 7월 6일
편집: Kenjiro Sugimoto 2023년 7월 7일
少し拍子抜けする回答かもしれませんが、実はそのまま要素積「.*」することで所望の答えが得られます。
% サンプル配列
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() 関数で同等の計算が可能です。以下、参考リンクです。

추가 답변 (1개)

Akira Agata
Akira Agata 2023년 7월 6일
편집: Akira Agata 2023년 7월 6일
配列 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);

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

제품


릴리스

R2022b

Community Treasure Hunt

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

Start Hunting!