比较两个数组并将它们与条件组合

时间:2016-10-12 16:59:06

标签: matlab

我有这些矩阵:

I1 = [60    30    15    35    20   -25    30     5    45    25   -10    40    10];
I2 = [60    30    60    35    20    60    30    60    45    25    60    40    60];
A= 0:12 ;

我想要这个:

Ir=[60 30 15 NaN 60 35 20 -25  NaN  60 30  5 NaN 60 45 25 -10 NaN  60  40  10 NaN 60]
Ar= [0  1  2  2   2  3  4   5   5    5  6  7  7   7  8  9  10  10  10  11  12  12 12]

如何: 当I1I2相同时,请继续。如果不同,请使用I1I2的元素,并在它们之间插入NaN。

ArA的使用元素,并在I1I2的元素相同时继续。但是当不同时,重复A的值3次。 I1的第一位,然后是NaN,然后是I2

无法找到实现此目的的方法。我该怎么做?

3 个答案:

答案 0 :(得分:1)

更加向量化的方法是创建一个增强矩阵,其中顶行为I1,底行为I2,中间行为NaN。之后,创建一个logical矩阵,其大小与刚刚创建的此扩充矩阵相同,您可以调整此矩阵的列,您可以在此处设置此logical矩阵的底部两行对于此矩阵中I1 == I2的每个对应列,为0。完成后,使用此logical矩阵并对增广矩阵编制索引。这种索引的优点是它可以访问列主要格式的元素,这正是您所追求的。我们只会对增强矩阵的顶行进行采样,除非I1I2中的元素彼此不相等。如果是这种情况,我们会对整个列进行抽样,其中包括I1nanI2。由于我们是按列访问的,因此您所需的输出是一行,因此您需要在完成后转置结果。

要创建索引向量,您可以执行相同的操作,但是您将创建一个ID矩阵,其中我们有三行,其中每一行都是索引ID数组A。索引到A后,您还需要转置此结果:

aug = [I1; nan(1,numel(I1)); I2];
V = true(size(aug));
V(2:3, I1 == I2) = false;
Ir = aug(V).';
ID = repmat(A, 3, 1);
Ar = ID(V).';

我们得到:

>> format compact
>> Ir
Ir =
  Columns 1 through 17
    60    30    15   NaN    60    35    20   -25   NaN    60    30     5   NaN    60    45    25   -10
  Columns 18 through 23
   NaN    60    40    10   NaN    60
>> Ar
Ar =
  Columns 1 through 17
     0     1     2     2     2     3     4     5     5     5     6     7     7     7     8     9    10
  Columns 18 through 23
    10    10    11    12    12    12

答案 1 :(得分:0)

我可以为您提供伪代码。

for each value in A
  if I1 at [current A value] equals I2 at [current A value]
    add I1 at [current A value] to end of Ir 
    add [current A value] to end of Ar
  else
    add I1 at [current A value] to end of Ir
    add NaN to Ir
    add I2 at [current A value] to end of Ir
    add [current A value] to Ar 3 times

如果你的问题是概念性的,希望这已经足够了 如果您有任何其他问题,请与我们联系。

答案 2 :(得分:0)

您可以使用两个索引并解决问题。第一个索引ii越过输入向量,第二个索引k随着计算的进行而增长。使用for-loopif-statement的简单代码如下所示:

I1 = [60    30    15    35    20   -25    30     5    45    25   -10    40    10];
I2 = [60    30    60    35    20    60    30    60    45    25    60    40    60];
Ir = [];
Ar = [];
k = 1;
for ii=1:length(I1)
    if I1(ii)==I2(ii)
        Ir(k) = I1(ii);
        Ar(k) = ii-1;
        k = k + 1;
    else
        Ir(k:k+2) = [I1(ii) NaN I2(ii)];
        Ar(k:k+2) = ii-1;
        k = k + 3;
    end
end

将导致:

Ir =

    60    30    15   NaN    60    35    20   -25   NaN    60    30     5   NaN    60    45    25   -10   NaN    60    40    10   NaN    60


Ar =

     0     1     2     2     2     3     4     5     5     5     6     7     7     7     8     9    10    10    10    11    12    12    12