给定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。但还有其他更有效的方法吗?
答案 0 :(得分:4)
你可以使用这个单行:
A(any(~isfinite(A), 2), :) = NaN;
~isfinite(A)
对A
的无限或NaN
元素返回true。 any(..., 2)
查找具有此类元素和逻辑索引的所有行有助于将这些行中的值设置为NaN
。
答案 1 :(得分:2)
在MATLAB中查看logical indexing。
使用A(idx_row,:)
,您可以选择在idx_row
中选择的所有行以及这些行的所有列。这正是您想要设置为NaN
的值。所以它就变成了
A(idx_row,:) = nan;
答案 2 :(得分:1)
两个参数find可以找到行索引。
[r,~] = find(isinf(A) | isnan(A));
A(r,:) = nan;
不确定它是否更有效,因为我不知道你的循环看起来如何,但我的猜测是它至少会相当有效。它至少是干净的,因为代码易于阅读,只需要2行代码。请注意r
可能包含重复项,但这不应该是一个问题。
答案 3 :(得分:0)
您可以使用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.