私は 2 つのテンソルを持っています:A
は 2 次テンソルでB
、4 次テンソルです。2 つのテンソルの二重内積 (:)を計算すると、結果のテンソルのランクが 2 減ることがわかっているので、私の例では、結果は 2 次テンソルになるはずです。
ただし、このコードを MATLAB で記述すると、次のエラーが発生します。
マトリックスの寸法が同意しなければなりません。
どうすればこの問題を解決できますか?
私は 2 つのテンソルを持っています:A
は 2 次テンソルでB
、4 次テンソルです。2 つのテンソルの二重内積 (:)を計算すると、結果のテンソルのランクが 2 減ることがわかっているので、私の例では、結果は 2 次テンソルになるはずです。
ただし、このコードを MATLAB で記述すると、次のエラーが発生します。
マトリックスの寸法が同意しなければなりません。
どうすればこの問題を解決できますか?
MATLABのコロン演算子は、別の機能を提供するため、期待どおりには機能しません。実際、MATLAB には二重内積の組み込み実装はありません。たとえば、自分で実装する必要があります。
idx = max(0, ndims(A) - 1); %// Index of first common dimension
B_t = permute(B, circshift(1:ndims(A) + ndims(B), [0, idx - 1]));
double_dot_prod = squeeze(sum(squeeze(sum(bsxfun(@times, A, B_t), idx)), idx));
とはテンソル (つまりA
、多次元行列) です。これをベクトル化するのは難しかったので、正しい計算ができたことを願っています。B
必要に応じて、便宜上、このコードを関数に入れることができます。適切な実践のために、両方のテンソルが 2 階以上であることも確認してください。これはあなたのためのフレンドリーなコピー&ペーストバージョンです:
function C = double_dot(A, B)
assert(~isvector(A) && ~isvector(B))
idx = max(0, ndims(A) - 1);
B_t = permute(B, circshift(1:ndims(A) + ndims(B), [0, idx - 1]));
C = squeeze(sum(squeeze(sum(bsxfun(@times, A, B_t), idx)), idx));
アドバイス: オンライン チュートリアルを読んで、MATLAB 言語の基本に慣れることをお勧めします。