三维矩阵的非重叠滑动窗和

时间:2018-03-01 01:30:14

标签: matlab sum window

我遇到以下情况遇到了一些困难:

我有一个名为'ch'的3D矩阵。我想在5个矩阵的组中在z方向上求和并将它们保存到不同的矩阵,'ch_sample',例如ch_sample(:,:,1)= ch(:,:,1)+ ch(:,:,2)... + ch(:,:,5); ch_sample(:,:,2)= ch(:,:,6)+ ch(:,:,7)... + ch(:,:,10)等。

因此,我想获得一个非重叠滑动窗口(size = 5)来获取矩阵z方向的和。我需要在ch。

中保留值的x和y坐标

我尝试通过for循环完成此操作并失败。

欢迎任何建议和意见!

谢谢!

2 个答案:

答案 0 :(得分:0)

首先,你不需要为这个简单的任务显式循环。其次,要使其对大矩阵有效,请使用辅助矩阵:

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

答案 1 :(得分:0)

此处reshapesum可用于获取结果:

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是一种非常便宜的操作。