2016-10-20 4 views
0

거대한 4D 행렬이 있고 2D 행렬로 분할해야합니다.4D 행렬을 2D 조각으로 자르기 MatLab

slice1 = 4dmatrix(:,:,1,1) 
slice2 = 4dmatrix(:,:,1,2) 

등 하지만 루프를 사용하여이 작업을 수행하는 방법을 작동하지 않을 수 있습니다 : 그것은 수동으로 하나 하나를 이렇게 쉽다. 지금까지 본 모든 것이 원래의 매트릭스를 재구성합니다 (나는 원하지 않습니다).

+0

그래서 정확히 무엇을 원하니? 각 슬라이스가이 4D 매트릭스의 2D 슬라이스 인 3D 매트릭스를 생성 하시겠습니까? 원하는 출력은 무엇입니까? – rayryeng

+3

'ii'와'jj'를 둘러싼 루프'D4matrix (:, :, ii, jj)'에서이 방법으로 색인을 작성하십시오. 모든 2D 슬라이스를 별도로 만들지 마십시오 (동적 변수 이름 지정) (http://stackoverflow.com/questions/32467029/how-to-put-these-images-together/32467170#32467170). 나쁜 프로그래밍 습관. 또한 변수 이름이 숫자로 시작될 수 없기 때문에 실제로'4dmatrix'라는 행렬의 이름을 지정할 수 없습니다. – Adriaan

답변

1

당신은 단순히 두 개의 액세스 변수는 1 할 권리 조각에 액세스 for 루프의 한 쌍을 사용할 수 있습니다 :

for ii = 1 : size(fourDMatrix, 3) 
    for jj = 1 : size(fourDMatrix, 4) 
     slice = fourDMatrix(:, :, ii, jj); 
     % Do your processing here... 
    end 
end 

그러나, 나는 reshape를 사용하는 것이 좋습니다 수 있다면, 당신은 그것을 사용한다 . 이 각각의 조각이 당신의 4D 매트릭스에서 2D 조각 인 3D 매트릭스를 만들 reshape을 사용할 수 있으며, 당신은 단순히 수행

slices = reshape(fourDMatrix, size(fourDMatrix, 1), size(fourDMatrix,2), []); 

이은 행과 열은 것과 동일한 차원 매트릭스를 생성합니다 4D 매트릭스에서. 그러나 코드 끝에있는 []은 4D 행렬을 자동으로 풀어서 3 차원을 따라 발생하고 4 차원을 뒤 따르게됩니다. 기본적으로 3D 매트릭스에 몇 개의 2D 슬라이스가 있는지를 자동으로 계산합니다. 예를 들어, 만약 당신의 4D 행렬은 slices(:,:,2)A(:,:,2,1);에 해당하며 slices(:,:,6)A(:,:,2,2)에 해당하고, 위의 코드는 slices(:,:,1)A(:,:,1,1)에 해당하는 9 x 9 x 16 매트릭스를 생성합니다, A을 불러 크기 9 x 9 x 4 x 4를 펼쳤습니다. 일반적으로 slices(:,:,kk)A(:,:,floor(kk/size(A,2)) + 1, mod(kk,size(A,2)) + 1에서 슬라이스에 액세스합니다.


1 : 변수 이름은 MATLAB에서 숫자로 시작할 수 없습니다. 변수 이름을 fourDMatrix으로 변경했습니다.

+1

감사합니다. 설명서에서 모양이 잘못 이해 된 것 같습니다. 정확하게 원했던 것입니다. – emmetbug

+0

전혀 문제 없습니다. 내가 도울 수있어서 기뻐! 나는 또한 혼란을 피하기 위해'재 형성 '에 관한 두 문장을 추가했다. 이것은 어떻게 작동하는지 더 깊이 이해하는 데 도움이 될 수 있습니다. – rayryeng

관련 문제