我正在寻找一些关于使用CONVN来计算3d矩阵上一维空间平均值的指导。我对内核的内核翻转感到有点担心,我希望有人能够为我澄清行为。
类似的帖子仍然让我感到有些困惑:
问题:
我每天都有不同来源地区流域的河流和天气流量数据。
所以矩阵就是这样,
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');
问题:
结果不太匹配,我想知道我的内核尺寸是否不正确。非常感谢任何指导。
答案 0 :(得分:0)
根据您的问题的背景判断,您有一个3D矩阵,并且您希望在所有3D切片上独立地找到每行的移动平均值。上面的代码应该有效(第一种情况)。但是,valid
标志返回一个矩阵,其大小在卷积边界方面是有效的。请查看您链接到的帖子的第一点以获取更多详细信息。
具体而言,由于valid
标志,每行的前21个条目将丢失。只有当你到达每一行的第22个条目时,卷积内核才会完全包含在矩阵的一行内,并且从那里得到有效结果(没有双关语)。如果您希望在边界处看到这些条目,那么如果您想要保持与输入相同的大小矩阵或'same'
,则需要使用'full'
标记flag(默认值),它给出了从最极端外边缘开始的输出大小,但请记住移动平均线将使用一堆零完成,因此前21个条目不会是无论如何,你的期望。
但是,如果我正在解释您的要求,那么valid
标志就是您想要的,但请记住,您将缺少21个条目以适应边缘情况。总而言之,您的代码应该可以工作,但要注意如何解释结果。