【问题标题】:How to ignore NaNs in MATLAB?如何在 MATLAB 中忽略 NaN?
【发布时间】:2013-01-29 15:20:40
【问题描述】:

我正在寻找一种方法来忽略矩阵中的特定条目,以便在 MATLAB 中进行后续线性回归

我有两个矩阵:y =

    9.3335    7.8105    5.8969    3.5928
    23.1580   19.6043   15.3085    8.2010
    40.1067   35.2643   28.9378   16.6753
    56.4697   51.8224   44.5587   29.3674
    70.7238   66.5842   58.8909   42.7623
    83.0253   78.4561   71.1924   53.8532

和 x =

    300   300   300   300
    400   400   400   400
    500   500   500   500
    600   600   600   600
    700   700   700   700
    800   800   800   800

我需要对 y 介于 20 到 80 之间的点进行线性回归,因此我需要一种方法来完全自动化该过程。我尝试制作离群的 y 值 [及其对应的 x 值] NaN,但在线性回归期间,matlab 将 NaN 包含在计算中,因此我得到了 NaN 输出。任何人都可以提出一个忽略这些条目或完全忽略 NaN 计算的好方法吗? (注意:y 中的列通常会有不同的值组合,所以我无法消除整行)。

【问题讨论】:

  • 您会分别对每一列执行线性回归,还是所有数据都对单个回归有贡献?
  • 你使用什么版本的 Matlab?您可以访问统计工具箱吗?
  • 林。注册将分别在每一列上完成,是的。我的目标是获得四对不同的斜率/截距,以便我可以使用循环进行以后的计算。
  • 我的 Matlab 版本是 R2011a。不知道统计工具箱是什么。
  • 感谢乔纳斯!它完美地工作!虽然我承认,但我并不完全理解循环中发生了什么以及如何从中获得线性回归值(我为此使用了一阶 polyfit)。你能详细说明那里发生了什么吗?谢谢。

标签: matlab


【解决方案1】:

如果 NaN 出现在 X 和 Y 矩阵中的相同位置,您可以使用如下函数调用,your_function( X(~isnan(X)), Y(~isnan(X)) )。如果 NaN 没有出现在相同的位置,您必须首先通过类似 `X(~isnan(X)| isnan(Y))' 的方式找到有效索引

【讨论】:

    【解决方案2】:

    由于您分别对每一列执行回归,您可以简单地将索引形成为具有有效 y 值的行:

    nCols = size(x,2);
    
    results = zeros(2,nCols);
    validY = y>20 & y<80; %# a logical array the size of y with valid entries
    nValid = sum(validY,1);
    
    for c = 1:nCols
        % results is [slope;intercept] in each column
        results(:,c) = [x(validY(:,c),c),ones(nValid(c),1)]\y(validY(:,c),c);
    
    end
    

    【讨论】:

    • 感谢乔纳斯!它完美地工作!虽然我承认,但我并不完全理解循环中发生了什么以及如何从中获得线性回归值(我为此使用了一阶 polyfit)。你能详细说明那里发生了什么吗?谢谢。
    • @user2022167:我正在求解Au=B 形式的方程组,其中A 的每一行都包含未知数的系数,即您的 x 值和 1(对于持续的)。为了得到未知数u,我“除”了A,即u=(A^-1)B。这是由 `\`-operator 完成的。
    • @user2022167:这就是你去线性代数课的目的:)
    • Q_Q 我忘记的线性代数太多了。但是,现在我正在浏览它,您的解释是有道理的。不过,最后一件事是什么?我在纸上写出矩阵,我有 x = [400 1] \ [23.158],我记不起 1 代表什么。
    • @user2022167: u(1)*x+u(2)*1 = y
    猜你喜欢
    • 2011-09-24
    • 2018-07-05
    • 2015-06-29
    • 2012-04-03
    • 2012-09-09
    • 2020-10-08
    • 1970-01-01
    • 2016-12-15
    • 2013-09-17
    相关资源
    最近更新 更多