2016-02-04 3 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 и it = [].

Есть ли какая-нибудь функция, которая может вам помочь?

+0

Возможно, [ 'isnan'] (http://www.mathworks.com/help/symbolic/isnan.html)? – whrrgarbl

+0

Как насчет числовых значений типа '5.0'? В глазах Matlab это то же самое, что и '5', если вы храните их в одном и том же двойном (float) массиве. – thewaywewalk

ответ

0

Если вы измените all функцию состояния isnan(A)|round(A)==A вы получите ожидаемый результат. При этом условии NaN s в основном игнорируются, так как наличие поплавка в любой строке столбца, которая в противном случае заполнена NaN, будет по-прежнему возвращать значение false, но наличие NaN s в столбце int все равно вернет 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); 
Смежные вопросы