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

15 Ansichten (letzte 30 Tage)
osamu
osamu am 6 Jul. 2023
Bearbeitet: Kenjiro Sugimoto am 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文を使わずに計算する方法はありますでしょうか。
宜しくお願いします。

Akzeptierte Antwort

Kenjiro Sugimoto
Kenjiro Sugimoto am 6 Jul. 2023
Bearbeitet: Kenjiro Sugimoto am 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() 関数で同等の計算が可能です。以下、参考リンクです。

Weitere Antworten (1)

Akira Agata
Akira Agata am 6 Jul. 2023
Bearbeitet: Akira Agata am 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);

Kategorien

Mehr zu Logical finden Sie in Help Center und File Exchange

Produkte


Version

R2022b

Community Treasure Hunt

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

Start Hunting!