2013-07-04 389 views
2

我有兩個張量:A是一個二階張量,B是一個四階張量。我知道在計算兩個張量的double dot product (:)時,得到的張量的秩將減少2,所以在我的例子中,結果應該是二階張量。兩張張量的雙點積

然而,當我在寫這個MATLAB代碼,它提供了以下錯誤:

Matrix dimensions must agree.

我怎樣才能解決這個問題?

+1

1.提供一些代碼以顯示張量如何表示以及您如何做產品。 2. by ** double dot product **你的意思是'(:)'運算符在MATLAb中像'A(:)'嗎? –

+0

您尚未提供任何代碼。我們怎麼能知道你在做什麼錯了? – 2013-07-04 14:36:58

+0

@ISarasky你看過我的回答嗎? –

回答

3

MATLAB中的colon運算符不符合您的期望,因爲它提供了另一個功能。事實上,在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)); 

其中AB是您的張量(即多維矩陣)。向量化這是一個難以解決的問題,所以我希望我的計算正確!

如果你想,你可以把這個代碼放在一個函數中以方便使用。爲了良好的實踐,還要驗證這兩個張量都是第二或更高的。這裏有一個友好的複製粘貼版本供您:

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語言的基礎知識。

+2

謝謝Eitan的指導。 –

+0

@ISarasky高興地幫助:) –

+1

我的天啊,你是如何設法引導那頭野獸的?幹得好! – Cramer

1

這是非常不幸的,但是MATLAB在我的知識中沒有在他們的標準庫中實現張量的內積。爲了產生內積的標量版本,你需要或者低效通過像每個條目迭代:

function C = double_dot(A,B) 
    for i=1:1:3 
     for j=1:1:3 
      C = C + A(i,j)*B(i,j); 
     end 
    end 

也可以運行的埃坦的量化代碼(以上)的輕微修改。他的代碼產生一個向量。兩張張量的內積應該是一個標量。所以你需要總結他的代碼產生的最終數組。

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 = sum(squeeze(sum(squeeze(sum(bsxfun(@times, A, B_t), idx)), idx))); 

埃坦的代碼是在MATLAB中dot功能的實現(見https://www.mathworks.com/help/matlab/ref/dot.html)。注意matricies點積的部分。相反,您應該更簡單地使用:

function C = double_dot(A,B) 
    C = sum(dot(A,B));