我正在寻找一种方法在MATLAB中有效地从矩阵中删除NaN数(即不使用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))来做这个,但最终返回一个向量而不是矩阵。有没有让它返回矩阵的技巧?
答案 0 :(得分:26)
如果每行都没有NaN或所有NaN,可以使用以下方法进行删除:
M(isfinite(M(:, 1)), :)
答案 1 :(得分:19)
最好的方法是
M(any(isnan(M),2),:)=[]
将删除包含至少一个NaN的任何行。
答案 2 :(得分:2)
实际上我想推荐一种稍微不同(也更通用)的方法。
因此,如果您要忽略(即删除)至少有一列包含NaN
的所有行,则只需:
M= M(0== sum(isnan(M), 2), :)
答案 3 :(得分:1)
尝试 snip function
。我想在一个简单的函数中解决这样的典型问题:
B = snip(A,nan)
您可以找到function file at
它也适用于所有其他'x','0'或其他任何元素,并处理更多类似的问题。
答案 4 :(得分:1)
以下函数从指定尺寸的数据中删除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