【发布时间】:2015-10-19 09:26:53
【问题描述】:
matlab中使用指数函数时nan的问题应该如何处理?
例如,我可以使用指数平滑函数:
v = datenum(2008, 1, 1):datenum(2010, 11, 31); % time vector
d = rand(1,length(v)); % data vector
fd = d;
alpha_o = 0.2;
for ii = 2:length(fd);
fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1);
end
plot(v,d); hold on; plot(v,fd);
但是,如果我在时间序列中有一个 nan(或者结果是许多 nan):
d(10) = nan;
然后,平滑的输出将是 nan,遵循时间序列中 nan 的位置。
应该如何处理?我应该删除所有的 nans 然后运行该函数吗?
我认为对我的数据使用指数平滑函数的意义在于它提供了原始系列的平滑和滞后版本。但是,如果您删除了 nans,这不会导致结果错误吗?
我看过这篇帖子Using exponential smoothing with NaN values,但它并没有真正提供任何我可以在这里应用的有用提示。
我也想过避开 nan 部分,说如果是 nan,使用最后一个已知的平滑值:
fd = d;
alpha_o = 0.2;
for ii = 2:length(fd);
if isnan(fd(ii)) == 1;
fd(ii) = fd(ii-1);
else
fd(ii) = alpha_o.*fd(ii) + (1-alpha_o).*fd(ii-1);
end
end
plot(v,d); hold on; plot(v,fd);
这是最好的解决方案吗?不知道如果第一个值是一个 nan 想法我会怎么做......
【问题讨论】:
-
对待nans的方式是你的选择。你可以删除它们,你可以用插值填充它们,或者你可以让你的算法输出 NaN 作为 NaN 输入。这取决于您的 NaN 是什么以及如何创建。
-
如果您正在进行平滑和插值,通常的做法是删除您的 NaN,因为它们会在一定程度上影响您的结果。
-
我不确定这是否适合 StackOverflow。这是非常基于意见的,取决于您的具体情况以及您希望实现的目标,这在您的问题中并不清楚。
-
我不会简单地删除
NaN值。你最终会得到numel(fd) ~= numel(v)。
标签: matlab