使给定行号的所有元素都等于 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
。
在 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
。