在MATLAB中将NaN分配给数组行中的唯一条件

时间:2017-11-15 22:11:25

标签: matlab indexing find nan

我有一个像:

这样的数组

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,但无法使其生效。

2 个答案:

答案 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

希望这有帮助!