3

私は 2 つのテンソルを持っています:Aは 2 次テンソルでB、4 次テンソルです。2 つのテンソルの二重内積 (:)を計算すると、結果のテンソルのランクが 2 減ることがわかっているので、私の例では、結果は 2 次テンソルになるはずです。

ただし、このコードを MATLAB で記述すると、次のエラーが発生します。

マトリックスの寸法が同意しなければなりません。

どうすればこの問題を解決できますか?

4

2 に答える 2

3

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 言語の基本に慣れることをお勧めします。

于 2013-07-08T12:25:16.830 に答える