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
추가 제안 사항을 보내 주시면 감사하겠습니다.
임의의 크기의 경우'bsxfun'과'permute'로 할 수 있지만 더 많은 메모리가 필요하고 더 빠르다는 것은 확실하지 않습니다. 최근의 Matlab 버전 루프는 예전처럼 느리지는 않습니다. 일부 크기가 고정되어 있으면 악용 될 수 있습니다. 어떤 크기 (치수)가 고정되어 있으며 그 가치는 무엇입니까? –
'A'와 'B'의 일반적인 모양은 무엇입니까? – Divakar
[link] (https://www.mathworks.com/matlabcentral/answers/62382-matrix-multiply-slices-of-3d-matricies) 여기에 최적화 된 라이브러리가 있습니다. 나는 그것을 짓는 데 문제가있었습니다. – Rotem