我有兩個張量:A
是一個二階張量,B
是一個四階張量。我知道在計算兩個張量的double dot product (:)時,得到的張量的秩將減少2,所以在我的例子中,結果應該是二階張量。兩張張量的雙點積
然而,當我在寫這個MATLAB代碼,它提供了以下錯誤:
Matrix dimensions must agree.
我怎樣才能解決這個問題?
我有兩個張量:A
是一個二階張量,B
是一個四階張量。我知道在計算兩個張量的double dot product (:)時,得到的張量的秩將減少2,所以在我的例子中,結果應該是二階張量。兩張張量的雙點積
然而,當我在寫這個MATLAB代碼,它提供了以下錯誤:
Matrix dimensions must agree.
我怎樣才能解決這個問題?
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));
其中A
和B
是您的張量(即多維矩陣)。向量化這是一個難以解決的問題,所以我希望我的計算正確!
如果你想,你可以把這個代碼放在一個函數中以方便使用。爲了良好的實踐,還要驗證這兩個張量都是第二或更高的。這裏有一個友好的複製粘貼版本供您:
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語言的基礎知識。
這是非常不幸的,但是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));
1.提供一些代碼以顯示張量如何表示以及您如何做產品。 2. by ** double dot product **你的意思是'(:)'運算符在MATLAb中像'A(:)'嗎? –
您尚未提供任何代碼。我們怎麼能知道你在做什麼錯了? – 2013-07-04 14:36:58
@ISarasky你看過我的回答嗎? –