2016-07-19 2 views
1

치수가 256 x 3527 x 8 인 3D 배열 (이미지)이 있습니다. I는, 예를 들면 제MATLAB : 1D 벡터로 3D 배열 나누기

통해 하나의 벡터에 의해 3 차원으로 모든 값을 분할하고자 내 벡터 같다 : 크기 256 x 3527의 화상의 각 층에

Esun = [1 2 3 4 5 6 7 8] 

(8의 레이어), 나는 Esun의 해당 값으로 나누고 싶습니다.

MATLAB에 이러한 기능이 없으면 3D 배열을 8 개로 잘라 루프를 돌리거나 Esun을 3D 반복 배열로 바꾸고 행렬 분할을 수행하는 것이 더 빠릅니까?

답변

1

arrayfun를 사용하지 마십시오. 대신 permute와 결합 된 강력한 bsxfun을 사용

Esun = 1:8; % Esun = [1 2 3 4 5 6 7 8]; 
B = bsxfun(@rdivide, A, permute(Esun, [1 3 2])); 

변수 A는 그 크기 256 x 3527 x 8입니다 가지고있는 3D 행렬이다. permute에 대한 호출은 Esun을 사용하고이를 1 행 1 열의 3D 벡터로 변환합니다. 그런 다음 bsxfun은 3D 벡터를 크기가 256 x 3527 x 8 인 3D 매트릭스가되도록 브로드 캐스팅합니다. 각 슬라이스 ii 번째 값을 Esun에 표시합니다. 그런 다음 요소 별 분류를 수행합니다.

기본적으로 반복되는 배열 작업을 수행하지만 내부적으로 bsxfun에서 복제가 수행되며 반복 배열을 먼저 만든 다음 나누기를 수행하는 것보다 빠릅니다.

+0

bsxfun을 사용하여 약간의 정보를 읽었으며 한 가지 질문 만 있습니다. 사용하는 그래픽 카드 유형이 속도에 영향을 줍니까? –

+0

아니요. 그래픽 메모리는'gpuArray'를 사용할 때 MATLAB에서만 사용되며 nVidia 카드 만 지원됩니다. 그렇지 않으면 성능에 영향을주는 대부분 CPU와 RAM이어야합니다. – rayryeng

+0

아, 그래, 내가 mathworks 페이지의 정의를 잘못 읽은 것 같습니다. 해명 해줘서 고마워. –

0

당신은 다음과 같은 arrayfun를 사용할 수 있습니다

c=arrayfun(@(i) X(:,:,i)*Esun(i),1:8,'UniformOutput',0); 

X는 이미지 배열이라고 가정. 상기에서, MATLAB은은 1x8 셀 어레이를 반환, 당신은 새로운 배열을 얻기 위해 cat 기능을 사용할 수 있습니다 : 그것은 본질적으로 루프로

B = cat(3, c{:}); % cat all cell elements in 3-rd dim