作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试计算矩阵多列的移动平均值。在阅读了关于 stackoverflow 的一些答案后,即 this第一,filter
函数似乎是可行的方法。但是,它不会忽略 NaN
元素,我想本着函数 nanmean
的精神忽略 NaN
元素。下面是示例代码:
X = rand(100,100); %generate sample matrix
X(sort(randi([1 100],1,10)),sort(randi([1 100],1,10))) = NaN; %put some random NaNs
windowlenght = 7;
MeanMA = filter(ones(1, windowlenght) / windowlenght, 1, X);
最佳答案
>> A = [1 2 3 4 5; 2 nan nan nan 6; 3 nan nan nan 7; 4 nan nan nan 8; 5 6 7 8 9]
A =
1 2 3 4 5
2 NaN NaN NaN 6
3 NaN NaN NaN 7
4 NaN NaN NaN 8
5 6 7 8 9
>> colfilt(A, [3,3], 'sliding', @nanmean)
ans =
0.6250 1.1429 1.5000 2.5714 1.8750
1.1429 2.2000 3.0000 5.0000 3.1429
1.5000 3.0000 NaN 7.0000 3.5000
2.5714 5.0000 7.0000 7.8000 4.5714
1.8750 3.1429 3.5000 4.5714 3.1250
(如果您只关心“完整” block ,适本地选择内部行/列)
或者,您也可以使用 nlfilter ,但是您随后需要明确(通过匿名函数句柄)您将对该 block 执行的操作;特别是,要使用 nanmean 使其从整个 block 中产生标量输出,您需要在匿名函数中调用 nanmean 之前将每个 block 转换为列向量:
>> nlfilter(A, [3,3], @(x) nanmean(x(:)))
ans =
0.6250 1.1429 1.5000 2.5714 1.8750
1.1429 2.2000 3.0000 5.0000 3.1429
1.5000 3.0000 NaN 7.0000 3.5000
2.5714 5.0000 7.0000 7.8000 4.5714
1.8750 3.1429 3.5000 4.5714 3.1250
但是,根据记录,matlab 声称 colfilt 通常会更快,因此通常 nlfilter 最好保留在处理每个 block 时将输入转换为列没有意义的情况。
另请参阅 sliding operations in general 上的 matlab 手册页/章节.
关于matlab - 忽略 NaN 的移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44803025/
我是一名优秀的程序员,十分优秀!