2017-02-03 2 views
1

5D 배열 A가 있고 모든 x, y 및 z에 대해 블록 A (x, y, z, :, :)를 세로로 스택 싶습니다. 나는 다음을 수행했다 :nD 배열의 블록을 수직으로 쌓는 방법은 무엇입니까?

A = rand(128, 128, 64, 20, 3); 
    a = 1; 
    for z = 1:Z 
     for y = 1:Y 
      for x = 1:X 
       res(a:a+T-1,:) = squeeze(A(x,y,z,:,:)); 
       a = a + T; 
      end 
     end 
    end 

정확하지만이 계산은 내 목적에 비해 상당히 느린 것으로 보인다. 누구나 동일한 목표를보다 효율적으로 달성하는 방법을 찾아 낼 수 있습니까?

+0

, 코드는 빠른 (상대적으로)입니다. 첫 번째 for 루프 앞에'res = -1 * ones (128 * 128 * 64 * 20, 3)'를 포함하여 사전 할당하십시오. 훨씬 더 빠른 대안은 아래의 해답을보십시오. –

+0

왼쪽에있는 체크 표시를 클릭하여 대답을 수락하십시오. 그러면 답변되지 않은 질문 목록에서 빠져 나올 수 있습니다. –

답변

0

reshapepermute을 통해 확인할 수 있습니다. 첫째, 재구성이 어떻게 작동하는지 이해하십시오.

c = randi(9,[2 2 3]) 

c(:,:,1) = 

    5  8 
    2  6 


c(:,:,2) = 

    4  4 
    5  1 


c(:,:,3) = 

    3  2 
    2  3 

2 x 6 행렬에 c를 형성합시다.

ans = 

    5  8  4  4  3  2 
    2  6  5  1  2  3 

이제 6 x 2 행렬입니다.

ans = 

    5  4 
    2  1 
    8  3 
    6  2 
    4  2 
    5  3 

은 재 형성된 매트릭스를 생성하는 동안, MATLAB이 c의 제 치수를 탐색 시작과 재 형성된 매트릭스 (첫 번째 열에 즉 행을 따라) 제 치수를 따라 놓는다 것을 알 수있다. 구체적으로, 재구성 된 행렬의 제 1 열을 형성하는

.

하여 20x3 행렬 즉 사차원의 행을 따라 것

하여 예에 다시 고쳐 행렬의 첫 번째 열을 예정. 첫 번째 행은 20x3 하위 행렬의 항목, 즉 다섯 번째 차원을 따릅니다. 당신이 고쳐 매트릭스 (1,1)에서 (1,2)에 통과 그러나, 당신이 당신의 처음 세 차원에서 모든 요소를 ​​수용해야합니다 (예 : 128, 128, 64을, 왜? 먼저, 다음 다음 y과 당신의 x 차원을 통과하기 때문에 마지막으로 z 치수) . 따라서 귀하의 대답은 차원을 따라 이동하려는 것입니다 : 4,1,2,3,5 그 순서대로.

답변 : 당신은 그냥`res`을 미리 할당하는 경우 그런데

sz_A = size(A); 
p = sz_A(4)*prod(sz_A(1:3)) 
reshaped_A = reshape(permute(A,[4, 1, 2, 3, 5]), [p size(A,5)]) 
+0

이것은 매우 좋습니다! 시간 내 주셔서 감사합니다. 설명에 이어 Ahback = permute (reshaped_A, sz_A (4), sz_A (1), sz_A (2), sz_A (3), sz_A (5)를 사용하여 reshaped_A 형식을 으로 되돌릴 수있었습니다.)), [2 3 4 1 5]); – Nead

관련 문제