【问题标题】:MATLAB: Using CONVN for moving average on MatrixMATLAB:使用 CONVN 对 Matrix 进行移动平均
【发布时间】:2015-05-31 19:57:38
【问题描述】:

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

还有一篇让我有点困惑的类似帖子:

CONVN example about flipping

问题:

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

所以矩阵是这样的,

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 返回一个矩阵,其大小在卷积边界方面是有效的。如果我正确解释了您的问题,请尝试使用 same 标志而不是 valid 标志。让我知道这是否有效。同时,您能否用一些示例数据更新您的帖子,说明您认为答案是什么以及 MATLAB 返回什么?
  • 顺便说一句,你有一个对称的内核,所以翻转应该对卷积输出没有影响。您指定的是标准移动平均内核,因此卷积应该可以按照您的预期找到移动平均线......但我有点困惑,因为您说上述方法不起作用!
  • 您好。问题在于“有效”标志。我只是用手比较边缘的结果,并没有看到正确的结果。我现在几乎不想收回我的问题....
  • 这完全取决于你:)。你的问题是一个有效的问题(不是双关语),它会绊倒很多人。如果您确实希望它保留下来,我可以写一个总结我们所讨论内容的答案。如果您想撤回/删除您的答案,那完全没有问题。告诉我你想做什么!
  • 随意添加答案,我会标记为已解决。谢谢!

标签: matlab convolution


【解决方案1】:

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

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

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

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


祝你好运!

【讨论】:

    猜你喜欢
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2018-07-25
    • 2018-06-08
    • 2015-03-07
    • 1970-01-01
    相关资源
    最近更新 更多