You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab中含NaN值矩阵的插值/外推及曲面绘图问题

问题描述

现有一组传感器测量数据,包含41个样本的频率扫描结果,涉及变量frequency、measured data、concentration、viability,均为41×100的矩阵。其中measured data矩阵的不同样本(行)、不同频率点(列)存在大量NaN值,导致无法绘制曲面图。尝试以下方法时遇到问题:

  • 使用fillmissing函数:因频率为对数刻度,第一行的NaN填充结果不符合预期
  • 使用interp1函数:触发报错:
    Error using griddedInterpolant Sample points must be unique
    Error in interp1 F = griddedInterpolant(X,V(:,1),method);
    Error in measured_interp = interp1(f(measured_nans), measured(measured_nans), f(measured_nans));
    
    需解决不同行列NaN值的合理插值与外推问题,简化示例代码如下:
    %Load variables
    measured = [NaN NaN NaN NaN 3.1 2.2 2.6 1.5 5 5.3, 
    -82 -63 -50 -36 NaN NaN -15 -5 -1 -1.5, 
    73 73.4 69 66 49 NaN 36 30 30.4 NaN];
    
    f= logspace(1,2,10);
    f= repmat(f, 3,1);
    
    %Identify NaNs
    measured_nans = isnan(measured);
    
    %Fill NaNs with nearby values
    measured_fill = fillmissing (measured, "linear"); %Just showing what this looks like
    
    %replace NaNs with interpolated values
    measured_interp = interp1( f(measured_nans), measured(measured_nans), f(measured_nans) );
    
解决方案

问题根源分析

  1. interp1报错核心原因:传入的样本点f(measured_nans)包含大量重复值(每个样本行的频率序列完全相同),而griddedInterpolant要求输入样本点必须唯一。
  2. fillmissing不符合预期的原因:默认线性插值在原始频率域(线性刻度)执行,与频率的对数刻度特性不匹配,导致低频段填充偏差。

修正步骤与代码

针对每个样本行独立处理,在对数频率域进行插值/外推,彻底解决重复样本点问题:

%Load variables
measured = [NaN NaN NaN NaN 3.1 2.2 2.6 1.5 5 5.3, 
            -82 -63 -50 -36 NaN NaN -15 -5 -1 -1.5, 
            73 73.4 69 66 49 NaN 36 30 30.4 NaN];

% 原始对数刻度频率序列,无需重复生成矩阵
f = logspace(1,2,10);
% 转换为对数频率,适配刻度特性进行插值
log_f = log10(f);

% 初始化插值后的结果矩阵
measured_interp = measured;

% 逐行处理每个样本
for row = 1:size(measured, 1)
    % 获取当前行的有效数据索引
    valid_idx = ~isnan(measured(row, :));
    if sum(valid_idx) < 2
        % 若有效数据不足2个,无法插值,可根据需求填充固定值或跳过
        continue;
    end
    
    % 提取有效对数频率与对应测量值
    x_valid = log_f(valid_idx);
    y_valid = measured(row, valid_idx);
    
    % 对当前行所有频率点执行插值+外推,支持线性/平滑插值方法
    y_interp = interp1(x_valid, y_valid, log_f, 'linear', 'extrap');
    
    % 将插值结果替换当前行的NaN
    measured_interp(row, :) = y_interp;
end

% 查看最终插值结果
disp(measured_interp);

关键说明

  • 逐行独立处理:每个样本是独立的频率扫描单元,单独处理既避免跨样本干扰,又彻底解决interp1的重复样本点报错。
  • 对数域插值:在对数频率域执行插值,完全适配频率的对数刻度特性,确保低频段填充结果符合数据规律。
  • 外推支持:通过'extrap'选项处理首尾的NaN值(如第一行前4个低频NaN),外推逻辑基于有效数据的趋势延伸。
  • 方法可替换:若需要更平滑的插值效果,可将'linear'替换为'pchip'(保形插值)或'spline'(样条插值),需注意外推时的稳定性。

内容的提问来源于stack exchange,提问作者Alicia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:05:32