2014-01-21 4 views

답변

2

가 삼차원 24 다음 수의 배수가 아닌 상태에 도달 이 작업을 수행 :

그것은 가치가 무엇인지에 대한
n = 24; 
subs = ceil((1:size(A,3))/n) 

for ii = 1:size(A, 1) 
    for jj = 1:size(A,2) 

     result(ii,jj,:) = accumarray(subs', squeeze(A(ii,jj,:))); 

    end 
end 
5

3 RD로 4 번째 차원으로 reshape, sumsqueeze :

이 경우
B = squeeze(sum(reshape(A, size(A,1),size(A,2),24,[]), 3)); 
+2

또는'재편 (A, 크기 (A, 1), 크기 (A, 2), [], 24)'3 차원에 대한 자동 결정. – Jonas

+1

또한 나는 'squeeze' 대신에'permute (.., [1 2 4 3])'를 사용하여 싱글 톤 차원을 없앴습니다 (IMO가 명시 적으로 더 좋음) – Amro

+0

btw'reshape (A, size ... – Amro

4

, 여기에 루프 버전은 다음과 같습니다

,691를
A = rand(70,51,8760); % sample data 3D matrix 
n = 24;    % group every n-pages and sum across the 3rd dimension 

% calculate starting indices 
sz = size(A); 
ind = 1:n:sz(3); 

% compute the sums in each group of pages 
B = zeros(sz(1),sz(2),numel(ind)); 
for k=1:numel(ind) 
    B(:,:,k) = sum(A(:,:,ind(k):ind(k)+n-1), 3); 
end 

위의 내용은 size(A,3)n으로 균등하게 나눌 수 있다고 가정합니다. 물론 이전의 것과 같이 첫 번째 fix(size(A,3)/n)*n 조각을 처리 한 다음 마지막 반복을 사용하여 나머지 페이지를 수행하면 조정할 수 있습니다.


당신은 @RodyOldenhuis's solution에 대해 위의 코드를 비교할 수 :


B2 = permute(sum(reshape(A,sz(1),sz(2),n,[]),3), [1 2 4 3]); 
assert(isequal(B,B2)) 

(이 빠르게위한 루프,하지만 훨씬보다는 내 테스트에서했다)

@Dan's solutionaccumarray 전화 번호로 완전히 벡터화 할 수도 있습니다.

[I,J,K] = ndgrid(1:sz(1),1:sz(2),1:sz(3)); 
B3 = accumarray([I(:) J(:) ceil(K(:)./n)], A(:)); 
assert(isequal(B,B3)) 

(경고 :이 버전은 다른 솔루션보다 훨씬 느리게 말할 것도없고, 메모리를 많이 사용)

관련 문제