【问题标题】:Finding columns that contain both integers and NaN查找同时包含整数和 NaN 的列
【发布时间】:2016-05-14 16:08:34
【问题描述】:

我有一个包含数值 (float) 和分类值 (Int) 的矩阵

作为

A = 1   NaN   2.2   3.2  4
    NaN 7.9   5.1   NaN  5
    3    5.5  NaN   4.1  NaN

我想把它分成矩阵; 一个包含 Int 值,另一个包含浮点值

 it = 1   4
      NaN 5
      3   NaN

  flt = NaN  2.2 3.2
      7.9  5.1 NaN
      5.5  NaN 4.1

我使用以下代码

int_cols = all( round(A)==A, 1 ); %// logical indexing into integer columns
it = A(:,int_cols);
flt = A(:,~int_cols);

但是,NaN 不等于 NaN,因此它出现在 flt 矩阵中并且它 = []。

有什么功能可以帮忙吗?

【问题讨论】:

  • 或许isnan?
  • 5.0 这样的数值呢?在 Matlab 的眼中,它与 5 相同,只要将它们存储在同一个双(浮点)数组中即可。

标签: matlab matrix nan


【解决方案1】:

如果您将all 函数更改为条件isnan(A)|round(A)==A,您将获得预期的输出。在这种情况下,NaNs 基本上会被忽略,因为在以其他方式填充 NaNs 的列的任何行中具有浮点数仍将返回 false,但在整数列中具有 NaNs 仍将返回真的。需要注意的是,如果您有一列完全是 NaNs,它将显示为 int。

你的例子:

A = [1   NaN   2.2   3.2  4;
     NaN 7.9   5.1   NaN  5;
     3    5.5  NaN   4.1  NaN];
int_cols = all(isnan(A)|round(A)==A,1);
it = A(:,int_cols);
flt = A(:,~int_cols);

之后,

it = 1   4
     NaN 5
     3   NaN

flt = NaN  2.2 3.2
      7.9  5.1 NaN
      5.5  NaN 4.1

【讨论】:

    【解决方案2】:

    你可以使用这样的东西,

    A = [1   NaN   2.2   3.2  4;
         NaN 7.9   5.1   NaN  5;
         3    5.5  NaN   4.1  NaN];
    B = isnan(A);
    A(B) = 0;
    int_cols = all( round(A)==A, 1 );
    A(B) = NaN;
    it = A(:,int_cols);
    flt = A(:,~int_cols);
    

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 2013-12-17
      • 2016-10-30
      • 2019-01-20
      • 2016-09-23
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      相关资源
      最近更新 更多