使给定行号的所有元素等于 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的主要内容,如果未能解决你的问题,请参考以下文章

easyui datagrid设置rownumber行号显示NaN怎么回事

如何使 PyCharm 始终显示行号

matlab怎么找到一个矩阵中所有相同的两行并返回行号

我如何使用 pygments 使降价显示行号?

在给定行号的文本文件中打印行

查找文件中所有出现的字符串并在 Perl 中打印其行号