2016-07-13 7 views
3

MATLAB에서 일련의 2x2 행렬을 3D 텐서로 쌓았으며 행렬의 각 인스턴스에 대해 행렬 곱셈을 수행하고 싶습니다. matlab에 텐서 점 곱을 효율적으로 구현했습니다.

C_ijk = sum(a_ilk * b_ljk, over all l) 

내 현재의 구현은 매우 읽기 쉽게이

function mats = mul3D(A, B) 
     % given a list of 2D matrices (e.g. rotation matrices) applies 
     % the matrix product for each instance along the third dimension 
     % mats(:,:,i) = A(:,:,i) * B(:,:,i) for all i 
     % for this to succeed matrix dimensions must agree. 
     mats = zeros(size(A,1), size(B,2), size(B,3)); 
     for i=1:size(B, 3) 
      mats(:,:,i) = A(:,:,i) * B(:,:,i); 
     end 
    end 

처럼 보이지만 내가 MATLAB하지 않는 것을 말하는 사람을 기억

로 나의 C는 A *의 B를 =

정의된다 for-loops처럼.

더 빠른 메모리를 사용하면서 더 많은 메모리를 소비하지 않는 더 나은 구현을 생각해보십시오. 내 코드는이 for 루프에서 실행 시간의 50 %를 소비합니다.

편집 귀하의 제안에 대한

감사합니다. 불행히도 제 3 자 코드에 새로운 의존성을 도입 할 수 없습니다.

질문에 따라 나는 2x2xn 구조의 텐서 스 (tensors)를 이용하는 아이디어를 가지고있었습니다. 최신 구현은 다음과 같습니다.

function mats = mul3D(A, B) 
     % given a list of 2D matrices (e.g. rotation matrices) applies 
     % the matrix product for each instance along the third dimension 
     % mats(:,:,i) = A(:,:,i) * B(:,:,i) for all i 
     % for this to succeed matrix dimensions must agree. 
     mats = zeros(size(A,1), size(B,2), size(B,3)); 

     mats(1,1,:) = A(1,1,:) .* B(1,1,:) + A(1,2,:) .* B(2,1,:); 
     mats(2,1,:) = A(2,1,:) .* B(1,1,:) + A(2,2,:) .* B(2,1,:); 
     if(size(mats,2) > 1) 
      mats(1,2,:) = A(1,1,:) .* B(1,2,:) + A(1,2,:) .* B(2,2,:); 
      mats(2,2,:) = A(2,1,:) .* B(1,2,:) + A(2,2,:) .* B(2,2,:); 
     end 
    end 

추가 제안 사항을 보내 주시면 감사하겠습니다.

+0

임의의 크기의 경우'bsxfun'과'permute'로 할 수 있지만 더 많은 메모리가 필요하고 더 빠르다는 것은 확실하지 않습니다. 최근의 Matlab 버전 루프는 예전처럼 느리지는 않습니다. 일부 크기가 고정되어 있으면 악용 될 수 있습니다. 어떤 크기 (치수)가 고정되어 있으며 그 가치는 무엇입니까? –

+0

'A'와 'B'의 일반적인 모양은 무엇입니까? – Divakar

+0

[link] (https://www.mathworks.com/matlabcentral/answers/62382-matrix-multiply-slices-of-3d-matricies) 여기에 최적화 된 라이브러리가 있습니다. 나는 그것을 짓는 데 문제가있었습니다. – Rotem

답변

1

mtimesx을 사용하는 것이 좋습니다.
는 여기를 참조하십시오 : https://www.mathworks.com/matlabcentral/answers/62382-matrix-multiply-slices-of-3d-matricies

mtimesx "매트릭스 3 차원 Matricies의 조각을 곱"할 최적화 된 MEX 파일을 사용합니다.

mtimesxBLAST library을 사용합니다 (BLAST 라이브러리는 Matlab 설치의 일부 임). 여기에서

다운로드 mtimesx 소스 코드 :

http://www.mathworks.com/matlabcentral/fileexchange/25977-mtimesx-fast-matrix-multiply-with-multi-dimensional-support 나는 Matalb r2014b에 MEX 파일을 구축하는 문제가 있었다.
문제는 r2014a 위의 Matlab 버전이 파일 mexopts.bat이 부족하다는 것입니다.
mex 작성 스크립트는 mexopts.bat을 사용합니다.

mexopts.bat을 다운로드하여 해결했습니다.
내가 비주얼 스튜디오 2010 컴파일러를 사용하여, 발견하고 여기 mexopts.bat 일치 :\AppData\Roaming\MathWorks\MATLAB\R2014b\

mtimesx 아주 잘 작동하고 결국 ...
c:\Users\로템 : http://www.dynare.org/DynareWiki/ConfigureMatlabWindowsForMexCompilation

내가 로컬 폴더에 mexopts.bat 복사 mex 파일을 사용하면 for 루프를 사용하는 것이 훨씬 빠릅니다.