gpt4 book ai didi

matlab - 忽略 NaN 的移动平均线

转载 作者:行者123 更新时间:2023-12-01 14:46:43 25 4
gpt4 key购买 nike

我正在尝试计算矩阵多列的移动平均值。在阅读了关于 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);

最佳答案

使用colfiltnanmean :

>> 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com