我有一个像:
这样的数组 A = [ 1 2 3 4; NaN NaN 3 4; NaN NaN NaN 4 ];
我需要一个索引,如下所示,其中第一个非NaN
值在大数组的每一行中设置为1
。结果索引应如下所示:
B = [ 0 0 0 0; 0 0 1 0; 0 0 0 1];
我已尝试在行中使用cumsum
,但无法使其生效。
答案 0 :(得分:0)
这会产生您正在寻找的结果:
a = [
1 2 3 4;
NaN NaN 3 4;
NaN NaN NaN 4
];
a_size = size(a);
[~,a_sub] = min(a.');
a_idx = sub2ind(a_size,(1:3)',a_sub');
b = zeros(a_size);
b(a_idx) = 1;
答案 1 :(得分:0)
由于我不允许发表评论,我正在添加答案。 @Tommaso Belluzzo给出的代码完成了这项工作,但假设行中的数字总是按递增顺序排列。例如,如果我们将矩阵定义为
a = [
1 2 3 4;
NaN NaN 5 4;
NaN NaN NaN 4
];
或
a = [
1 2 3 4;
NaN 5 NaN 4;
NaN NaN NaN 4
];
@Tommaso的代码在两种情况下都给出相同的输出,在每种情况下都是错误的。
b =
1 0 0 0
0 0 0 1
0 0 0 1
虽然可以通过简单的修改来实现这个问题的通用解决方案。
a_size = size(a);
c=isnan(a);
[~,a_sub] = min(c.');
a_idx = sub2ind(a_size,(1:3)',a_sub');
b = zeros(a_size);
b(a_idx) = 1;
然后收到的输出是 -
b =
1 0 0 0
0 0 1 0
0 0 0 1
b1 =
1 0 0 0
0 1 0 0
0 0 0 1
希望这有帮助!