2017-05-22 22 views
0

Matlab의 셀을 사용하여 A와 B의 블록 행렬 곱셈을 수행하려고합니다. 더 구체적으로 가정하십시오matlab 셀을 블록 행렬 곱셈

이제 블록을 포함하는 셀 배열로 a와 b를 변환 할 수 있습니다.

A = mat2cell(a,[2,2],[2,2]) 

ans = 

[2x2 double] [2x2 double] 
[2x2 double] [2x2 double] 

B = mat2cell(b,[2,2],[2,2]) 

ans = 

[2x2 double] [2x2 double] 
[2x2 double] [2x2 double] 

난 함수 C = foo에 필요한 (A를 B) C의 블록 행렬의 곱 A * B의 블록이 경우, 예를 들어이되도록 셀 어레이 C를 반환 할 것이다 :

C{1,1} = A{1,1}*B{1,1} + A{1,2}*B{2,1} 
C{1,2} = A{1,1}*B{1,2} + A{1,2}*B{2,2} 
... 

cell2mat(C)은 반환해야합니다 :

ans = 

28 28 40 40 
28 28 40 40 
60 60 88 88 
60 60 88 88 
  • 내가 할 수있는 이유를 단지 cell2mat(A)*cell2mat(B)이 있기 때문입니다하지 내 응용 프로그램에서는 대부분의 블록이 0이고 비효율적입니다.

  • 대부분의 블록이 0이지만, 0이 아닌 블록이 완전히 빽빽해서 또한 비효율적이기 때문에 sparse(cell2mat(A))*sparse(cell2mat(B))도 할 수 없습니다.

clunky 및 slow for 루프를 사용하지 않고이 문제를 해결하는 더 좋은 방법이 있습니까? 감사!

편집 : 나는 내가하고 싶은 것을 설명하는 작은 코드를 작성했습니다. 그러나 느린 데 더 좋은 방법이 있는지 궁금합니다.

function C = celltimes(A,B,nn,blocksize) 

C = cell(nn); 
[C{:}] = deal(sparse(blocksize,blocksize)); 

for ii = 1:nn 
    for jj = 1:nn 
     row = A(ii,:); 
     col = B(:,jj); 
     for kk = 1:nn 
     if (nnz(row{kk}~=0) && nnz(col{kk}~=0)) 
      C{ii,jj} = C{ii,jj}+row{kk}*col{kk}; 
     end 
     end 
    end 
end 

및 테스트 코드 : B를 사용하여 얻을 수됩니다에서

%test 

nn = 3; %number of blocks 
blocksize = 3; %block size 

a = randi([0,10],nn*blocksize) 
b = randi([0,10],nn*blocksize) 

A = mat2cell(a,repmat(blocksize,[1,nn]),repmat(blocksize,[1,nn])); 
B = mat2cell(b,repmat(blocksize,[1,nn]),repmat(blocksize,[1,nn])); 

C = celltimes(A,B,nn,blocksize); 

%verify result 
c = a*b; 
max(max(abs(cell2mat(C)-c))) 
+0

당신이 무엇을 달성하고자하는 아무 생각이 없습니다. 문제를보다 명확하고 형식적으로 기술하십시오. 어쩌면 예를 들자면 충족시켜야 할 모든 조건을 제시 할 수 있습니다. – kostek

+0

감사합니다. 죄송합니다. 더 명확하게 편집했습니다. – harbm

+1

당신의 검증에서 말 그대로'c = a * b'를하는 더 빠른 방법을 찾고 있습니까? 그렇다면 Matlab이 이미 해당 라인에서 수행하는 것보다 더 빨리 구현할 수 없습니다. 귀하의 원래 설명에서 그것은 당신이하고 싶은 것이 아니라고 들리므로 검증이 틀릴 수도 있습니다. – Wolfie

답변

0

귀하의 C는 : 귀하의 질문에서

C = a*b ; 

a=[ 1  1  2  2 
1  1  2  2 
3  3  4  4 
3  3  4  4] ; 

b=[ 2  2  4  4 
2  2  4  4 
6  6  8  8 
6  6  8  8] ; 

C = a*b