2013-07-04 5 views
2

두 개의 텐서가 있습니다 : A은 두 번째 텐서이며 B은 네 번째 텐서입니다. 나는 두 개의 텐서가있는 double dot product (:)을 계산할 때, 결과 텐서의 랭크가 2 씩 감소한다는 것을 알고 있습니다. 따라서 예제에서 결과는 2 차 텐서가되어야합니다. 두 개의 텐서의 두 점 곱

Matrix dimensions must agree.

가 어떻게이 문제를 해결할 수

: 내가 MATLAB에서이 코드를 작성할 때

은 그러나, 다음과 같은 오류를 준다?

+1

1. 텐서의 표현 방법과 제품 수행 방법을 보여주는 코드를 제공하십시오. 2. by ** double dot product ** MATLAB에서'(:)'연산자와 같은'(:)'연산자를 사용합니까? –

+0

모든 코드를 제공하지 않았습니다. 우리가 뭘 잘못하고 있는지 어떻게 알 수 있습니까? –

+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은 표준 라이브러리의 텐서 (tensors)를 내 지식으로 구현하지 않았습니다. 내적의 스칼라 버전을 생성하기 위해, 당신도 비효율적 등의 각 항목을 반복해야합니다

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 

또는 당신은 에이 탄의 벡터화 코드 (위)에 약간의 수정을 실행할 수 있습니다. 그의 코드는 벡터를 생성합니다. 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 = sum(squeeze(sum(squeeze(sum(bsxfun(@times, A, B_t), idx)), idx))); 

에이 탄의 코드에서 dot MATLAB 함수의 구현 (https://www.mathworks.com/help/matlab/ref/dot.html 참조). matricies의 내적 (dot product)에 대한 섹션을 주목하십시오. 대신에 다음을 사용하는 것이 더 간단합니다 :

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