我正在寻找一种有效地从 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)) 来做到这一点,但最终返回一个向量而不是矩阵。有没有办法让它返回一个矩阵?
如果每行没有 NaN 或全部为 NaN,您可以使用以下方法进行删除:
M(isfinite(M(:, 1)), :)
最好的方法是
M(any(isnan(M),2),:)=[]
这将删除任何包含至少一个 NaN 的行。
实际上我想推荐一种稍微不同(并且更通用)的方法。
因此,如果您想忽略(即删除)至少一列包含
NaN
的所有行,则只需:
M= M(0== sum(isnan(M), 2), :)
以下函数从指定维度的数据中删除 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
在我的例子中,M 是一个数据向量,末尾有一些 NaN 值。根据情况,NaN 值的数量有所不同。
我用过:
M = M(查找(isfinite(M)==1)); % 删除 NaN 值