假设我在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循环来迭代。
答案 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
找到相应的位置就可以了。
作为备注,这将允许A
和B
包含任意数量的列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