Удаление элементов NaN из матрицы - PullRequest
4 голосов
/ 19 января 2012

В строке есть один элемент NaN, я хочу его удалить.

A=[NaN  1  2;  
    3  NaN 4;  
   NaN  5  6];  

Желаемый результат:

[1 2;  
 3 4;  
 5 6]

Ответы [ 3 ]

6 голосов
/ 19 января 2012
A = [NaN 1 2 ; 3 NaN 4; NaN 5 6]
sz = size(A);
B = reshape(A', size(A,1)*size(A,2), 1);
B(isnan(B)) = [];
B = reshape(B, sz(2)-1, sz(1))'
2 голосов
/ 19 января 2012

Я думал, что это можно сделать в одну строку, но я ошибался. Смотрите решение ниже:

Учитывая (добавленная строка помогает мне отладить мою индексацию ниже):

>> A = [NaN 1 2 ; 3 NaN 4; NaN 5 6; 7 8 NaN]
A =
   NaN     1     2
     3   NaN     4
   NaN     5     6
     7     8   NaN

Тогда:

>> Atrans = A';
>> B = reshape(    Atrans(~isnan(Atrans))    ,[],size(Atrans,2))'
B =
     1     2
     3     4
     5     6
     7     8

Между прочим, идиома Matlab по выполнению простой логической проверки массива в рамках операции логического индексирования очень распространена и невероятно полезна. Архетипический пример:

>> x(x>0)   %This returns a 1D column vector of all values of x 
            %which are greater than 0, regardless of the initial
            %size of x.  Multidimensional inputs are unwrapped 
            %column-first

Все остальное выше - обработка размера и размера.

0 голосов
/ 19 января 2012

Вот, пожалуйста, обратите внимание, что код не является надежным.Предполагается, что действительно в каждой строке есть элемент NaN.

Хотя это не векторизованное решение, оно имеет и другие преимущества - например, четкий код.

for i=1:size(A,1)
   x = A(i,:);
   x(isnan(x)) = [];
   B(i,:) = x;
end

B

B =

1     2
3     4
5     6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...