我遇到以下情况遇到了一些困难:
我有一个名为'ch'的3D矩阵。我想在5个矩阵的组中在z方向上求和并将它们保存到不同的矩阵,'ch_sample',例如ch_sample(:,:,1)= ch(:,:,1)+ ch(:,:,2)... + ch(:,:,5); ch_sample(:,:,2)= ch(:,:,6)+ ch(:,:,7)... + ch(:,:,10)等。
因此,我想获得一个非重叠的滑动窗口(大小= 5)来获取矩阵z方向的和。我需要在ch中保留值的x和y坐标。
我已尝试通过for循环完成此操作并失败。
欢迎任何建议和意见!
谢谢!
首先,你不需要为这个简单的任务显式循环。其次,要使其对大矩阵有效,请使用辅助矩阵:
clear
NumToSum = 5;
M = randi([0,9],[4,3,10]); %our matrix
cumsumM = cumsum(M,3); %helper matrix. cumulative sum in 3rd dimension
R0 = cumsumM(:,:,1:NumToSum);
R1 = cumsumM(:,:,NumToSum+1:end) - cumsumM(:,:,1:end-NumToSum);
R=cat(3,R0,R1); %the result
disp([M,R]) %display side by side
group_size = 5;
s = size(ch);
grp = reshape(ch, s(1)*s(2), group_size, []); % reshape to form groups
sumgrp = sum(grp, 2); % sum of each group calculated
ch_sample = reshape(sumgrp, s(1), s(2),[]); % reshape back to original dimensions
一体:
ch_sample = reshape(sum(reshape(ch, s(1)*s(2), group_size, []), 2), s(1), s(2),[]);
*注意:reshape
是一个非常便宜的操作。