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

问题描述 投票:0回答:2

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

我有一个名为'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循环完成此操作并失败。

欢迎任何建议和意见!

谢谢!

matlab sum window
2个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.