MATLAB:如何有效地去除矩阵中的NaN元素
我正在寻找一种有效地从MATLAB中的矩阵中删除NaN数的方法(即不使用for循环) 我将提供一个快速的例子来说明我试图实现的目标: 假设我有一个矩阵M:MATLAB:如何有效地去除矩阵中的NaN元素,matlab,Matlab,我正在寻找一种有效地从MATLAB中的矩阵中删除NaN数的方法(即不使用for循环) 我将提供一个快速的例子来说明我试图实现的目标: 假设我有一个矩阵M: 3.00 1.00 1.00 3.00 NaN NaN 3.00 3.00 1.00 1.00 NaN Na
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)), :)
事实上,我想推荐一种稍微不同(更一般)的方法 因此,如果您想忽略(即删除)至少有一列包含
NaN
的所有行,那么只需:
M= M(0== sum(isnan(M), 2), :)
最好的办法是
M(any(isnan(M),2),:)=[]
这将删除至少包含一个NaN的任何行。请尝试我的
剪切功能。我想在一个简单的函数中解决这样的典型问题:
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
正是我想要的。谢谢您知道这是否比Steve建议的重塑命令更快吗?请使用此方案。这肯定比移除所有NAN后使用重塑更有效。@jeremiah willcock@woodchips。。。如何对M(all(isnan(M),1),:)=[]列执行此操作代码>由于某种原因无法工作。我转置并使用了这个,但应该有一个更好的方法。感谢这将删除inf
值。最好使用M(~isnan(M(:,1)),:)
我建议M=M(~any(isnan(M),2),:)
如果您正在为它编写函数,为什么remove\u dim
是字符串?为什么只支持二维阵列?为什么不支持N-D数组,并像其他许多方法一样使用“沿维”参数呢?它可能会起作用,但似乎这个答案既有很高的复杂性,又有很低的灵活性。至少维度输入应该是一个数字,这将大大简化您的代码。@DennisJaheruddin它可以工作,我使用它来处理TB中的大型数据集,特别是CSV文件。我在2D数据集/数据库上寻找面向行或列的数据的函数,但找不到。所以我想到了分享。它可以扩展到N维。它似乎可以工作,但感觉不直观。使用字符串'1'
删除值1。但是使用值nan
删除值nan
。如果要删除字符'1'
,您应该怎么做我认为它能做的事情可能是合理的,但你要求它的方式只是一种痛苦。当涉及更高维度时,会发生什么也不清楚。