【问题标题】:Removing NaNs from vectors in MATLAB从 MATLAB 中的向量中删除 NaN
【发布时间】:2016-03-09 16:52:52
【问题描述】:

我想从两个向量中删除 nans,向量必须是相同的长度,所以如果我在一个向量中删除一个 nan,则必须删除另一个向量中的对应值,即使它不是 nan。例如:

x = [1 nan 3 4 5]
y = [6 7 8 nan 10]

我想删除 x 中的 nan,以及 y 中的 7。另外,我想删除 y 中的 nan 和 x 中的 4,这样向量保持相同的长度。这个问题类似于MATLAB: How To Efficiently Remove NaN Elements from Matrix 这里提出的问题,但我是 MATLAB 新手,我不确定如何用向量而不是矩阵来做同样的事情。谢谢您的帮助。

【问题讨论】:

  • 我强烈建议您在下面使用 Choward 的答案,而不是 Brainkz 的答案。干净多了。

标签: matlab


【解决方案1】:

这将确保您的向量 x 和 y 保持彼此相同的大小,而且您只有 (x,y) 对是有意义的。

ind = ~isnan(x) & ~isnan(y) ;
xn = x(ind);
yn = y(ind);

【讨论】:

  • ind = ~isnan(x) & ~isnan(y) 是 MATLAB 中比较常见的语法
  • @Dan 我不知道你是否正确。常见的 AND 通常是“&&”。但是,您需要对向量使用此“and()”函数。使用普通的“&&”是行不通的。我将不得不看看这个单一的“&”是否适用于矢量情况。
  • 不,&& 是您在标量上用于评估条件的短路操作,&and 相同(在文档中明确表示)并且是元素和运算符。写and(x,y) 而不是x & y 是非常罕见的,事实上我从未见过有人这样做。这就像写plus(x,y) 而不是x + y
  • @Dan 哦,太棒了!你每天学习新的东西!感谢您的提醒!
  • 我认为您应该编辑您的答案,因为除此之外,您的解决方案是最好的方法。
【解决方案2】:

尝试以下方法:

x = [1 nan 3 4 5]
y = [6 7 8 nan 10]
id1 = find(isnan(x));
id2 = find(isnan(y));
x([id1,id2]) = []
y([id1,id2]) = []

输出:

x =
     1     3     5
y =
     6     8    10

解释:

find(isnan(x));

x 中创建一个索引为 NaN 的向量。我们对y 做同样的事情。然后,我们使用[id1,id2] 连接两个向量。最后,x([id1,id2]) = [] 从存在 NaN 的向量中删除元素。

【讨论】:

    【解决方案3】:

    内存管理和速度最有效的解决方案是使用逻辑索引从现有数组中删除值,而不是创建新数组。

    xn = isnan(x); yn = isnan(y); % find the locations of the NaNs
    x(xn | yn) = []; % delete elements from x that are NaN in x OR y
    y(xn | yn) = []; % delete elements from y that are NaN in x OR y
    

    但除非您有非常大的数组,否则您不会注意到性能差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-17
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多