使给定行号的所有元素都等于 NaN

Make all elements of given row numbers equal to NaN

在 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。但是还有其他更有效的方法吗?

在 MATLAB 中查看 logical indexing

使用 A(idx_row,:) 您 select 在 idx_row 中 select 编辑的所有行以及这些行的所有列。这正是您要设置为 NaN 的值。所以它就变成了

A(idx_row,:) = nan;

您可以使用 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.

两个参数find可以找到行索引。

[r,~] = find(isinf(A) | isnan(A));
A(r,:) = nan;

不确定它是否更有效,因为我不知道你的循环看起来如何,但我猜它至少会相当有效。它至少是干净的,因为代码易于阅读并且只需要 2 行代码。请注意 r 可能包含重复项,但这应该不是问题。

你可以使用这条线:

A(any(~isfinite(A), 2), :) = NaN;

~isfinite(A) returns 对于 A 的无限元素或 NaN 为真。 any(..., 2) 找到所有具有此类元素的行,逻辑索引有助于将这些行中的值设置为 NaN