【问题标题】:How to use interp1 with NaN values?如何将 interp1 与 NaN 值一起使用?
【发布时间】:2014-01-02 03:25:48
【问题描述】:

我有一个维度矩阵 (4000x4)(我们称之为A),其中包含绘制在 y 轴上的数据。我还有一个单独的矩阵,即 (4000,1)(我们称之为B),其中包含绘制在 x 轴上的数据。绘制时,这会为每列生成 4 个单独的折线图。

在矩阵A 中,每一列都有许多 Nan(不是数字)值。我想用插值替换 Nan 值。我已经编写了一个代码来执行此操作,但它会发出警告。这是我写的代码。

A(:,:)=interp1(B,A,B(:,1),'cubic');

当我运行此代码时,由于数据间隔不均匀而发出警告。这段代码也很慢。这段代码对于这项工作来说非常慢。我想修改代码,以便不发出警告,并且只对 Nan 的值进行插值,而不是对每个值进行插值(就像这段代码一样)。我需要这样做以加快代码速度。

谢谢

【问题讨论】:

    标签: performance matlab matrix warnings nan


    【解决方案1】:

    我假设您的数据向量 A 中只有 NaN 并且您的 x 轴向量 B 可以吗?

    例如,取一个从 1 到 100 的等距时间向量 t。还有一个数据向量 x,其中每十个值是 NaN

    % example data
    t = 1:100;
    x = 100*t-t.^2;
    x(10:10:end) = NaN;
    

    现在将tx 的所有不是NaN 的值作为样本点,并用完整的时间向量t 作为查询点对其进行插值。

    xi = interp1( t(~isnan(x)), x(~isnan(x)) , t, 'cubic');
    

    或者对你的情况稍微复杂一点:

    % example data
    B = (1:4000)';                 % 4000x1 double
    A = repmat(1000*B-B.^2,4,1)';  % 4000x4 double
    A(randi(400,40,1)) = NaN;      % random NaNs in your data matrix
    
    Ai = zeros(size(A));
    for ii = 1:size(A,2);
        tmp = A(:,ii);
        Ai(:,ii) = interp1( B(~isnan(tmp)) , tmp(~isnan(tmp)) , B, 'cubic');
    end
    

    以及无环替代方案:

    C  = num2cell(A,1);
    Ci = cellfun(@(x) interp1( B(~isnan(x)), x(~isnan(x)), B,'cubic'), C, ...   
                 'UniformOutput',false);
    Ci = cell2mat(Ci')';
    

    【讨论】:

    • 我之前犯了一个错误。 A 是一个矩阵,而 B 实际上是一个向量。 A 中只有 Nan 值,B 中没有 nan 值。A 的值存在关系,但仅与彼此接近的值存在关系。所以值 (1,1) 与 (1:100,1) 密切相关,但与 (2000,1) 几乎没有关系。那么三次方法会是这里的最佳选择。
    • 不仅仅是将AB 交换——即使A(1,1) 的值也与A(100,1) 无关,因为interp1 只是进行分段插值,而'cubic' 只涉及4 个后续值。也许您正在寻找polyfit
    • @user3101914:看看我上次的编辑。我认为interp1 是正确的方法。我会考虑 'linear' 而不是 'cubic' - 只是尝试更适合您的需求。
    • 感谢现在有效的代码。但是,我仍然收到如下警告:警告:插值期间已忽略包含 NaN 值的数据列。 > 在 interp1>Interp1DStripNaN 在 239 在 interp1 在 176 为什么我会得到这个以及如何删除它?
    • 对于我的示例数据,代码工作得非常好。我猜问题是我的代码适用于 4x100 数据矩阵,而不是像您的情况那样适用于 100x4 或 4000x4。请转置您的数据矩阵A=A',然后重试。它应该绝对有效。如果没有,请尝试我的示例数据,看看是否有效。如果只是示例工作,请上传您的数据,我看看。
    【解决方案2】:

    使用外推选项。 这是matlab帮助中的一个例子

    无需外推 vq2 = interp1(x,v,xq,'线性') vq2 = NaN NaN 14 NaN NaN

    线性外推 vq3 = interp1(x,v,xq,'linear','extrap') vq3 = 8 10 14 4 2

    【讨论】:

      猜你喜欢
      • 2015-01-03
      • 1970-01-01
      • 2018-07-19
      • 2013-06-24
      • 2019-07-15
      • 2016-07-17
      • 2012-05-20
      • 1970-01-01
      • 2020-08-22
      相关资源
      最近更新 更多