我有这些矩阵:
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]
如何:
当I1
和I2
相同时,请继续。如果不同,请使用I1
和I2
的元素,并在它们之间插入NaN。
和Ar
是A
的使用元素,并在I1
和I2
的元素相同时继续。但是当不同时,重复A
的值3次。 I1
的第一位,然后是NaN
,然后是I2
。
无法找到实现此目的的方法。我该怎么做?
答案 0 :(得分:1)
更加向量化的方法是创建一个增强矩阵,其中顶行为I1
,底行为I2
,中间行为NaN
。之后,创建一个logical
矩阵,其大小与刚刚创建的此扩充矩阵相同,您可以调整此矩阵的列,您可以在此处设置此logical
矩阵的底部两行对于此矩阵中I1 == I2
的每个对应列,为0。完成后,使用此logical
矩阵并对增广矩阵编制索引。这种索引的优点是它可以访问列主要格式的元素,这正是您所追求的。我们只会对增强矩阵的顶行进行采样,除非I1
和I2
中的元素彼此不相等。如果是这种情况,我们会对整个列进行抽样,其中包括I1
,nan
和I2
。由于我们是按列访问的,因此您所需的输出是一行,因此您需要在完成后转置结果。
要创建索引向量,您可以执行相同的操作,但是您将创建一个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-loop
和if-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