使给定行号的所有元素等于 NaN
Posted
技术标签:
【中文标题】使给定行号的所有元素等于 NaN【英文标题】:Make all elements of given row numbers equal to NaN 【发布时间】:2016-01-02 21:42:14 【问题描述】:给定 MATLAB 中的矩阵,如果任何元素具有非有限值,我想让该行的所有元素都等于 NaN。例如:
输入:
A=[1 2 NaN
4 5 6
7 NaN 9
0 1 2
3 4 5
6 7 8
Inf 0 1
2 3 4
5 6 7
8 NaN 0];
输出:
B=[NaN NaN NaN
4 5 6
NaN NaN NaN
0 1 2
3 4 5
6 7 8
NaN NaN NaN
2 3 4
5 6 7
NaN NaN NaN];
如何做到这一点?
我是这样知道的:
idx_NaNinf = find((isnan(A)|isinf(A)) );
[idx_row,idx_col] = ind2sub(size(A),idx_NaNinf);
将所有行号存储在 idx_row 中并使用 for 循环,我可以使该行的元素等于 NaN。但是还有其他更有效的方法吗?
【问题讨论】:
【参考方案1】:你可以使用这个单行:
A(any(~isfinite(A), 2), :) = NaN;
~isfinite(A)
为A
的无限或NaN
的元素返回true。 any(..., 2)
查找具有此类元素的所有行,并且逻辑索引有助于将这些行中的值设置为 NaN
。
【讨论】:
谢谢!作为扩展,如果一行的所有列都为零,我想将整行设为 NaN。我怎样才能做到这一点?输入:[0 0 1; 0 0 0; 7 8 0; 0 0 0; 8 9 0; 0 0 0; 0 0 0];输出:[0 0 1;南南南; 7 8 0;南南南; 8 9 0;南南南; NaN NaN NaN]; @Meghana 这确实归功于这个答案,因为它坚持逻辑索引。我几乎考虑删除我自己的答案,但据我所知,这是不鼓励的。无论如何它很容易修复,只需为此添加一个条件:any(~isfinite(a), 2)) | ~any(a,2)
。并不是说几乎为零在这里不算数。然后就换成这样的东西:~sum(abs(a)>tol, 2)
。有点慢,但它应该可以工作。
@patrik 对不起,我没听懂你的意思....我的输入是V_in = [0 0 0; 0 1 2; 3 4 5; 0 0 0; 2 3 4; 0 0 0];
因为只有第一行和最后一行包含全零,它们必须被替换与 NaN。我希望我的输出是:V_out = [NaN NaN NaN ; 0 1 2; 3 4 5; NaN NaN NaN ; 2 3 4; NaN NaN NaN ];
@Meghana 我真的建议你通读一些Matlab Basics,但关于你的问题,你的答案中有~isfinite(A), 2)
的条件。这一个根本不够。您还需要检查全零~any(A,2)
。所以word中的语句应该是“如果任何值不是有限的或没有任何值不为零,则设置为NaN”。请注意,any(v,2)
对第二个索引进行操作。【参考方案2】:
两个参数find可以找到行索引。
[r,~] = find(isinf(A) | isnan(A));
A(r,:) = nan;
不确定它是否更有效,因为我不知道您的循环看起来如何,但我猜它至少会相当有效。它至少是干净的,因为代码易于阅读并且只需要 2 行代码。请注意,r
可能包含重复项,但这应该不是问题。
【讨论】:
这行得通。谢谢!作为扩展,如果一行的所有列都为零,我想让整行成为 NaN。我怎样才能做到这一点?输入:[0 0 1; 0 0 0; 7 8 0; 0 0 0; 8 9 0; 0 0 0; 0 0 0];输出:[0 0 1;南南南; 7 8 0;南南南; 8 9 0;南南南; NaN NaN NaN];【参考方案3】:您可以使用logical indexing。
filter = zeros(size(A,1), 1); % Initialize a filter.
for ii = 1:size(A,2)
filter = filter | (isnan(A(:,ii)) | isinf(A(:,ii))); % If there is any element in the column that is nan or inf, set the element to one.
end
B = A;
B(filter, :) = nan; % Make the row that contains any NaN or inf all NaNs.
【讨论】:
【参考方案4】:在 MATLAB 中查看logical indexing。
使用A(idx_row,:)
,您可以选择在idx_row
中选择的所有行以及这些行的所有列。这正是您要设置为NaN
的值。所以它就变成了
A(idx_row,:) = nan;
【讨论】:
谢谢!作为扩展,如果一行的所有列都为零,我想将整行设为 NaN。我怎样才能做到这一点?输入:[0 0 1; 0 0 0; 7 8 0; 0 0 0; 8 9 0; 0 0 0; 0 0 0];输出:[0 0 1;南南南; 7 8 0;南南南; 8 9 0;南南南; NaN NaN NaN];以上是关于使给定行号的所有元素等于 NaN的主要内容,如果未能解决你的问题,请参考以下文章