2016-08-15 4 views
1

따라서 가변 크기의 3dB 행렬 A이 있다고 가정 해 보겠습니다. B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); ...; squeeze(A(n,:,:))]과 같은 행렬을 쌓는 명령을 쉽게 사용할 수 있습니까?스택 서브 매트릭스 하나의 행렬에 3d 행렬

는 지금은 다음을 사용하지만, 그 불편은 :

if(length(A(:,1,1))==1) 
    B =squeeze(A); 
else 
    B = zeros(length(A(:,1,1)*length(A(1,:,1)), length(A(1,1,:))); 
    B(1:length(A(1,:,1)),:) = squeeze(A(1,:,:)); 

    for i=2:length(A(1,:,1) 
     B(1:i*length(A(1,:,1)),:)=... 
      vertcat(B, squeeze(A(i,:,:))); 
    end 
end 

답변

4

B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); ...; squeeze(n,:,:))]과 동일 할 것입니다. 확실하지가 루프보다 빠른입니다 :

B = num2cell(A, [2 3]); % split along first dimension into cells 
B = permute([B{:}], [2 3 1]); % concatenate the cells along second dimension 
    % and remove first dimension, which is a singleton 
4

당신은 행렬의 크기의 permutation과 트랜스와 reshape를 사용할 수 있습니다 정상적으로 임의의 행 수에 적응

C = reshape(permute(A,[3,2,1]),size(A,3),[]).'; 

합니다. 약간의 테스트 :

A = rand([3,4,4]); 
B = [squeeze(A(1,:,:)); squeeze(A(2,:,:)); squeeze(A(3,:,:))]; 
C = reshape(permute(A,[3,2,1]),size(A,3),[]).'; 
all(B(:)==C(:)) % should be true/1 
3

여기 permutereshape 사용하여 하나 더 -

B = reshape(permute(A,[2,1,3]),[],size(A,3)) 
+1

쓰레기는, 그 트랜스가 필요하지 알고 있었다. 잘 했어. – TroyHaskin

+0

@TroyHaskin 예! 적어도 OP에서 암시 한 것처럼 솔루션에서 덜 복잡해 보일 수 있도록 'size (A, 1) * size (A, 2)'를 대체하기 위해'[]'를 사용할 수 있습니다! – Divakar

+0

예. 그것은 다중 입력 버전 대 단일 배열 규칙을 사용하는 정신적 블록 일뿐입니다. 나는 지금 그 변화를 만들 것이라고 생각한다. – TroyHaskin