MATLAB: как эффективно удалить элементы NaN из матрицы - PullRequest
20 голосов
/ 05 марта 2011

Я ищу способ эффективного удаления чисел NaN из матрицы в MATLAB (т. Е. Без использования цикла for)

Я приведу быстрый пример, чтобы проиллюстрировать, чего я пытаюсь достичь:

Допустим, у меня есть матрица M:

          3.00          1.00
          1.00          3.00
           NaN           NaN
          3.00          3.00
          1.00          1.00
           NaN           NaN
           NaN           NaN
           NaN           NaN
           NaN           NaN
           NaN           NaN

Я хотел бы найти способ изменить это значение на

          3.00          1.00
          1.00          3.00
          3.00          3.00
          1.00          1.00

В настоящее время я пытаюсь сделать это через M(isfinite (M)), но в итоге возвращается вектор вместо матрицы.Есть ли хитрость, чтобы вместо этого она возвращала матрицу?

Ответы [ 5 ]

26 голосов
/ 05 марта 2011

Если у вас нет ни NaN, ни всех NaN в каждой строке, вы можете выполнить удаление, используя:

M(isfinite(M(:, 1)), :)
19 голосов
/ 30 мая 2011

Лучший способ это

M(any(isnan(M),2),:)=[]

, которая удалит любую строку, содержащую хотя бы один NaN.

2 голосов
/ 05 марта 2011

На самом деле я хотел бы рекомендовать немного другой (и более общий) подход.

Итак, если вы хотите игнорировать (т.е. удалить) все строки, где хотя бы один столбец содержит NaN, то просто:

M= M(0== sum(isnan(M), 2), :)
1 голос
/ 23 октября 2014

Следующая функция удаляет NAN из данных для указанных измерений:

function data_out = remove_nan (data_in, remove_dim)
%remove row or col from the data_in if there is a NaN element

% e.g., data_in =[1 2 3 4 NaN; 1 2 3 4 5; 1 2 3 NaN NaN]
% from this data remove col 4 and 5 such that data_out=[ 1 2 3; 1 2 3; 1 2
% 3]

if nargin==1

    col_loc=any(isnan(data_in),1);
    data_in(:,col_loc)=[];
    data_out=data_in;

elseif nargin==2

    if remove_dim=='col'
        %find the cols with nan and remove the colums
        col_loc=any(isnan(data_in),1);
        data_in(:,col_loc)=[];
        data_out=data_in;
    elseif  remove_dim='row'
        %find the rows with nan and remove the rows
        row_loc=any(isnan(data_in),2);
        data_in(row_loc,:)=[];
        data_out=data_in;
    end
else
    error( 'incorrect no of arguments')

end
1 голос
/ 03 июня 2013

попробуй мой snip function.Я хотел бы ответить на типичные вопросы, подобные этому, в одной простой функции:

B = snip(A,nan)

Вы можете найти файл функции в

. Он также работает со всеми другими 'x', '0' или любые другие элементы и решает более похожие проблемы.

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