我有 4x2 矩阵 A:
A = [2 NaN 5 8; 14 NaN 23 NaN]';
我想用 A 中每一列中的关联索引替换非 NaN 值。输出如下所示:
out = [1 NaN 3 4; 1 NaN 3 NaN]';
我知道如何手动为每一列执行此操作,但我想要一个自动解决方案,因为我要处理的矩阵要大得多。有人知道吗?
最佳答案
out = bsxfun(@times, A-A+1, (1:size(A,1)).');
工作原理:
A-A+1
将A
中的实际数字替换为1
,并将NaN
保留为NaN
(1:size(A,1)).'
是行索引的列向量bsxfun(@times, ...)
将上述两者与单例扩展相乘。
正如 @thewaywewalk 指出的那样, Matlab R2016以后的bsxfun(@times...)
可以替换成.*
,因为单例扩展默认开启:
out = (A-A+1) .* (1:size(A,1)).';
@Dev-Il 建议的替代方案是
out = bsxfun(@plus, A*0, (1:size(A,1)).');
这是有效的,因为乘以 0
会将实际数字替换为 0
,并保持 NaN
不变。
关于matlab - 用矩阵中的行索引替换非 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39830936/