【发布时间】:2012-02-13 21:01:39
【问题描述】:
每行有一个 NaN 元素,我想删除它。
A=[NaN 1 2;
3 NaN 4;
NaN 5 6];
想要的输出是:
[1 2;
3 4;
5 6]
【问题讨论】:
标签: matlab
每行有一个 NaN 元素,我想删除它。
A=[NaN 1 2;
3 NaN 4;
NaN 5 6];
想要的输出是:
[1 2;
3 4;
5 6]
【问题讨论】:
标签: matlab
A = [NaN 1 2 ; 3 NaN 4; NaN 5 6]
sz = size(A);
B = reshape(A', size(A,1)*size(A,2), 1);
B(isnan(B)) = [];
B = reshape(B, sz(2)-1, sz(1))'
【讨论】:
我以为可以在一行中完成,但我错了。请参阅下面的解决方案:
鉴于(添加的行帮助我调试下面的索引):
>> A = [NaN 1 2 ; 3 NaN 4; NaN 5 6; 7 8 NaN]
A =
NaN 1 2
3 NaN 4
NaN 5 6
7 8 NaN
然后:
>> Atrans = A';
>> B = reshape( Atrans(~isnan(Atrans)) ,[],size(Atrans,2))'
B =
1 2
3 4
5 6
7 8
顺便说一句,在逻辑索引操作中对数组执行简单逻辑检查的 Matlab 习语非常常见且非常有用。典型的例子是:
>> x(x>0) %This returns a 1D column vector of all values of x
%which are greater than 0, regardless of the initial
%size of x. Multidimensional inputs are unwrapped
%column-first
以上所有内容都是尺寸和尺寸处理。
【讨论】:
就是这样 - 请注意,代码并不可靠。它假定确实在每一行中都有一个NaN 元素。
虽然它不是矢量化解决方案,但它还有其他优点 - 例如清晰的代码。
for i=1:size(A,1)
x = A(i,:);
x(isnan(x)) = [];
B(i,:) = x;
end
B
B =
1 2 3 4 5 6
【讨论】:
A(isnan(A))=[] 返回A 的列数组。当应用reshape(注意sz(A,.) 的语法错误)时,它最终交换了第一行和第二行的第一个元素。