MATLAB:使用CONVN在矩阵

时间:2015-05-31 19:57:39

标签: matlab convolution

我正在寻找一些关于使用CONVN来计算3d矩阵上一维空间平均值的指导。我对内核的内核翻转感到有点担心,我希望有人能够为我澄清行为。

类似的帖子仍然让我感到有些困惑:

CONVN example about flipping

问题:

我每天都有不同来源地区流域的河流和天气流量数据。

所以矩阵就是这样,

dim 1(行)代表每个站点 dim 2(列)代表日期 昏暗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');

问题:

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

1 个答案:

答案 0 :(得分:0)

根据您的问题的背景判断,您有一个3D矩阵,并且您希望在所有3D切片上独立地找到每行的移动平均值。上面的代码应该有效(第一种情况)。但是,valid标志返回一个矩阵,其大小在卷积边界方面是有效的。请查看您链接到的帖子的第一点以获取更多详细信息。

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

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

顺便说一下,你有一个对称的内核,所以翻转应该对卷积输出没有影响。您指定的是标准移动平均内核,因此卷积应该可以用于找到您期望的移动平均值。

祝你好运!