Ответ 1
Если у вас нет ни NaN, ни всех NaN в каждой строке, вы можете сделать удаление, используя:
M(isfinite(M(:, 1)), :)
Я ищу способ быстрого удаления чисел 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)), но это приводит к возврату вектора вместо матрицы. Есть ли уловка, чтобы вернуть матрицу?
Если у вас нет ни NaN, ни всех NaN в каждой строке, вы можете сделать удаление, используя:
M(isfinite(M(:, 1)), :)
Лучший способ -
M(any(isnan(M),2),:)=[]
который удалит любую строку, содержащую хотя бы одно NaN.
На самом деле я хотел бы рекомендовать несколько иной (и более общий) подход.
Итак, в случае, если вы хотите игнорировать (то есть удалить) все строки, в которых по крайней мере один столбец включает NaN
, тогда просто:
M= M(0== sum(isnan(M), 2), :)
попробуйте мой snip function
. Я хотел задать типичные вопросы, подобные этому, в одной простой функции:
B = snip(A,nan)
вы можете найти функциональный файл в
Он также работает со всеми другими 'x', '0' или любыми другими элементами и заботится о более похожих проблемах.
Следующая функция удаляет 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