具有偏移值的Matlab合并数组

时间:2015-07-16 22:22:14

标签: matlab

假设我在matlab中有2个双精度数组,如何将它们与未知偏移合并?

例如:

A = 
1 1
2 2
3 3
4 4
5 5

B = 
2 6
3 5
4 4
5 3
6 2

当我不知道A和B之间在第一列中的值的偏移/重叠时,有没有办法从这两个数组创建一个包含3列的单个数组?

C =
1 1 NaN
2 2 6
3 3 5
4 4 4
5 5 3
6 NaN 2

有一种有效的方法吗?

我现在提出的解决方案是拼凑A和B的第一列,然后继续使用for循环来迭代。

2 个答案:

答案 0 :(得分:2)

这似乎有效。我有点担心边缘情况,而不是很多测试。

A = [...
     1     1; ...
     2     2; ...
     3     3; ...
     4     4; ...
     5     5];
B = [...
     2     6; ...
     3     5; ...
     4     4; ...
     5     3; ...
     6     2];

C1 = union(A(:,1), B(:,1));

C2 = nan(size(C1));
[~, ixsA] = ismember(A(:,1), C1);
C2(ixsA) = A(:,2);

C3 = nan(size(C1));
[~, ixsB] = ismember(B(:,1), C1);
C3(ixsB) = B(:,2);

C = [C1 C2 C3];

答案 1 :(得分:1)

组合union以获取唯一元素,然后ismember找到相应的位置就可以了。

作为备注,这将允许AB包含任意数量的列2或更高。

A = [1 1;2 2;3 3;4 4;5 5];
B = [2 6;3 5;4 4;5 3;6 2];

%Get the elements from the first columns of A and B
C = union(A(:,1), B(:, 1));
%Prepopulate C to the correct size with NaN's
C = [C, nan(size(C,1), size(A,2) + size(B,2) - 2)];

%Find the rows of C where column 1 of A ended up
[~, i] = ismember(A(:,1), C(:,1));
%Stick the rest of A in those rows in the first set of free columns
C(i, 2:size(A,2)) = A(:,2:end);

%Now do the same with B in the second set of free columns
[~, i] = ismember(B(:,1), C(:,1));
C(i, size(A,2) + 1:end) = B(:,2:end);

C

C =

     1     1   NaN
     2     2     6
     3     3     5
     4     4     4
     5     5     3
     6   NaN     2