MATLAB:使用 CONVN 在 Matrix 上进行移动平均

MATLAB: Using CONVN for moving average on Matrix

我正在寻找一些关于使用 CONVN 计算 3d 矩阵上一维移动平均值的指导。我对引擎盖下内核的翻转有点着迷,希望有人能够为我澄清这种行为。

这里有一个类似的 post,但仍然让我有点困惑:

问题:

我有不同源头位置流域的每日河流和天气流量数据。

所以矩阵是这样的,

dim 1(行)代表每个网站 dim 2(列)代表日期 dim 3(页面)代表不同类型的测量(河流高度、流量、降雨量等)

目标是尝试使用 CONVN 在每个站点为每个变量的每个观察点取 21 天移动平均线。

据我了解,我应该能够使用这样的内核:

ker = ones(1,21) ./ 21.;
mat = randn(150,365*10,4);
avgmat = convn(mat,ker,'valid');

我试过并创建了另一个内核,它也应该可以工作(我认为)并将 ker2 设置为:

ker2 = [zeros(1,21); ker; zeros(1,21)];
avgmat2 = convn(mat,ker2,'valid');

问题:

结果不太匹配,我想知道我这里的内核尺寸是否不正确。非常感谢任何指导。

从你问题的上下文来看,你有一个 3D 矩阵,你想在所有 3D 切片上独立地找到每一行的移动平均值。上面的代码应该可以工作(第一种情况)。但是,valid 标志 returns 一个矩阵,其大小在卷积边界方面是有效的。查看您链接到的 post 的第一点以了解更多详细信息。

具体来说,由于 valid 标志,每行的前 21 个条目将丢失。只有当你到达每一行的第 22 个条目时,卷积核才会完全包含在矩阵的一行中,并且从那一点你会得到有效的结果(没有双关语意)。如果你想在边界处看到这些条目,那么你需要使用 'same' 标志,如果你想保持与输入相同的大小矩阵或 'full' 标志(这是default) 它为您提供从最极端的外边缘开始的输出大小,但请记住,移动平均线将使用一堆零来完成,因此前 21 个条目无论如何都不是您所期望的。

但是,如果我正在解释您的要求,那么 valid 标志就是您想要的,但请记住,您将缺少 21 个条目以适应边缘情况。总而言之,您的代码应该可以工作,但要注意如何解释结果。

顺便说一句,你有一个对称内核,因此翻转应该不会影响卷积输出。您指定的是标准移动平均内核,因此卷积应该可以按您的预期找到移动平均。


祝你好运!