次元の違う配列の乗算について
15 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
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文を使わずに計算する方法はありますでしょうか。
宜しくお願いします。
0 Kommentare
Akzeptierte Antwort
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() 関数で同等の計算が可能です。以下、参考リンクです。
0 Kommentare
Weitere Antworten (1)
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;
% サンプル配列
X1 = randi(100, [3, 3, 10]);
C = [1 1 1; 2 2 2; 3 3 3];
% ページ毎の乗算
X3 = pagemtimes(X1, C);
0 Kommentare
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!