2016-02-04 41 views
0

我有包含数值(浮点)和分类值(INT)查找有含有整数和NaN的列

作为

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矩阵中并且它= []。

有什么功能可以帮忙吗?

+0

也许['isnan'(http://www.mathworks.com/help/symbolic/isnan.html)? – whrrgarbl

+0

数值如'5.0'怎么样?在Matlab的眼中,只要将它们存储在同一个double(float)数组中,它就与'5'一样。 – thewaywewalk

回答

0

如果您改变all功能的条件isnan(A)|round(A)==A你会得到预期的输出。在这种情况下,NaN基本上被忽略,因为如果在一列中的任何一行中有一个浮点,否则它将填充NaN s仍然会返回一个假,但是在一列中有NaN仍然会返回true。一个注意事项是,如果你有一列完整的NaN s它将显示为一个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 
0

您可以使用这样的事情,

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);