Подтвердить что ты не робот

MATLAB: как эффективно удалить элементы NaN из матрицы

Я ищу способ быстрого удаления чисел 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)), но это приводит к возврату вектора вместо матрицы. Есть ли уловка, чтобы вернуть матрицу?

4b9b3361

Ответ 1

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

M(isfinite(M(:, 1)), :)

Ответ 2

Лучший способ -

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

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

Ответ 3

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

Итак, в случае, если вы хотите игнорировать (то есть удалить) все строки, в которых по крайней мере один столбец включает NaN, тогда просто:

M= M(0== sum(isnan(M), 2), :)

Ответ 4

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

B = snip(A,nan)

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

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

Ответ 5

Следующая функция удаляет 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