3D 매트릭스 (70x51x8760) (경도 x 위도 x 시간)가 있고 각 24 시간 (요소)의 합계가 필요합니다. 새 매트릭스의 치수는 70x51x365입니다.매트릭스의 각 요소 24 개를 합친 것
어떤 아이디어가 있습니까?
3D 매트릭스 (70x51x8760) (경도 x 위도 x 시간)가 있고 각 24 시간 (요소)의 합계가 필요합니다. 새 매트릭스의 치수는 70x51x365입니다.매트릭스의 각 요소 24 개를 합친 것
어떤 아이디어가 있습니까?
가 삼차원 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
3 RD로 4 번째 차원으로 reshape
, sum
및 squeeze
:
B = squeeze(sum(reshape(A, size(A,1),size(A,2),24,[]), 3));
, 여기에 루프 버전은 다음과 같습니다
,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 solution을 accumarray
전화 번호로 완전히 벡터화 할 수도 있습니다.
[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))
(경고 :이 버전은 다른 솔루션보다 훨씬 느리게 말할 것도없고, 메모리를 많이 사용)
또는'재편 (A, 크기 (A, 1), 크기 (A, 2), [], 24)'3 차원에 대한 자동 결정. – Jonas
또한 나는 'squeeze' 대신에'permute (.., [1 2 4 3])'를 사용하여 싱글 톤 차원을 없앴습니다 (IMO가 명시 적으로 더 좋음) – Amro
btw'reshape (A, size ... – Amro