MATLABでPythonのnp.dotみたいな計算はできないですか?
解決したいこと
[m, n, l]と[l, k]サイズの配列があって、これの内積を計算したいです。
しかし簡単な方法は見つかりません。
dot関数を使ってもエラーです。
発生している問題・エラー
ar1 = rand(5,4,3);
ar2 = rand(3,2);
dot(ar1,ar2)
次を使用中のエラー: dot (行 37)
A と B は同じサイズでなければなりません。
自分で試したこと
ここに問題・エラーに対して試したことを記載してください。
tensorprod
という関数もあってこれも試してみましたが、違うみたいです。
Pythonだったらnp.dot
簡単にできるので、いつもこれを使って慣れています。
import numpy as np
ar1 = np.ones([5,4,3])
ar2 = np.ones([3,2])
ar = np.dot(ar1,ar2)
print(ar.shape) # (5, 4, 2)
同じdot
という名前の関数ですが、MATLABのdot
関数はPythonほど使い勝手がよくないらしいです。
一応for
ループを使ったらできなくもないが、これはちょっと面倒です。いい方法とは言い難いですね。
function ar = dot3d(ar1,ar2)
s1 = size(ar1);
s2 = size(ar2);
ar = NaN([s1(1:2) s2(2)]);
for i = 1:s1(1)
ar(i,:,:) = reshape(ar1(i,:,:),s1(2:3))*ar2;
end
end
ar1 = rand(5,4,3);
ar2 = rand(3,2);
ar = dot3d(ar1,ar2);
size(ar) % 5 4 2
ググって答えを探そうとしましたが、答えは全然見つかりません。
この計算は回転行列やアフィン変換などを計算する時にとても重要なはずなのに、MATLABで簡単にできる方法がないなんてあまり信じがたいです。
普段こんな計算をする時にMATLABでどうすれば一番いいですか?