Dav*_*ave 7 matlab interpolation nan missing-data
我有单元格数组,每个单元格包含一个值序列作为行向量.序列包含一些由表示的缺失值NaN.
我想用某种插值方法替换所有的NaN,我怎样才能在MATLAB中做到这一点?我也对如何处理这些缺失值的其他建议持开放态度.
请考虑此示例数据来说明问题:
seq = {randn(1,10); randn(1,7); randn(1,8)};
for i=1:numel(seq)
%# simulate some missing values
ind = rand( size(seq{i}) ) < 0.2;
seq{i}(ind) = nan;
end
Run Code Online (Sandbox Code Playgroud)
结果序列:
seq{1}
ans =
-0.50782 -0.32058 NaN -3.0292 -0.45701 1.2424 NaN 0.93373 NaN -0.029006
seq{2}
ans =
0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417
seq{3}
ans =
NaN NaN 0.42639 -0.37281 -0.23645 2.0237 -2.2584 2.2294
Run Code Online (Sandbox Code Playgroud)
编辑:
根据回复,我认为存在一个混乱:显然我不使用随机数据,上面显示的代码只是数据结构的一个例子.
实际数据是某种形式的处理信号.问题是在分析过程中,如果序列包含缺失值,我的解决方案将会失败,因此需要进行过滤/插值(我已经考虑过使用每个序列的平均值来填充空白,但我希望有更强大的功能)
好吧,如果您正在使用时间序列数据,那么您可以使用Matlab的内置插值函数.
这样的东西应该适合你的情况,但你需要稍微调整一下......即.如果您没有等间距采样,则需要修改该times线.
nseq = cell(size(seq))
for i = 1:numel(seq)
times = 1:length(seq{i});
mask = ~isnan(seq{i});
nseq{i} = seq{i};
nseq{i}(~mask) = interp1(times(mask), seq{i}(mask), times(~mask));
end
Run Code Online (Sandbox Code Playgroud)
您需要四处interp1寻找可以找出最适合您情况的选项.
小智 7
我会使用inpaint_nans,一种用于通过插值替换1维或2维矩阵中的纳米元素的工具.
seq{1} = [-0.50782 -0.32058 NaN -3.0292 -0.45701 1.2424 NaN 0.93373 NaN -0.029006];
seq{2} = [0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417];
seq{3} = [NaN NaN 0.42639 -0.37281 -0.23645 2.0237];
for i = 1:3
seq{i} = inpaint_nans(seq{i});
end
seq{:}
ans =
-0.50782 -0.32058 -2.0724 -3.0292 -0.45701 1.2424 1.4528 0.93373 0.44482 -0.029006
ans =
0.18245 -1.5651 -0.084539 1.6039 0.098348 0.041374 -0.73417
ans =
2.0248 1.2256 0.42639 -0.37281 -0.23645 2.0237
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34895 次 |
| 最近记录: |