最快的代码,用于在Matlab中合并两个不同维度的矩阵

时间:2017-03-20 16:43:05

标签: matlab

我在Matlab AB分别有两个矩阵MxNGxN

M可以大于或小于G

AB不包含相同的行。

我想以下列方式构建维度C的矩阵Hx(N+2)

C=[];
for i=1:size(A,1)
    %if A(i,1:end-1) coincides with a row in B(:,1:end-1) (it can coincide with only one row at most)
    %then C=[C;A(i,1:end) B(j,end)]; %where j is the index of the identical row in B

    %otherwise impose C=[C;A(i,1:end) 0]
end

for i=1:size(B,1)
    %if B(i,1:end-1) does not coincide with any row in A(:,1:end-1)
    %then impose C=[C; B(i,1:end-1) 0 B(i,end)];
end

例如:

A=[1 2 3 4 5 100; 6 7 8 9 10 101; 11 12 13 14 15 102];
B=[6 7 8 9 10 103; 15 16 17 18 19 104]
C=[1 2 3 4 5 100 0; 6 7 8 9 10 101 103; 11 12 13 14 16 102 0; 15 16 17 18 19 0 104]

由于MG可能非常高,我正在寻找执行此操作的最快方法。

2 个答案:

答案 0 :(得分:2)

您可以使用ismember +索引来完成任务:

[idx1,idx2] = ismember(A(:,1:end-1), B(:,1:end-1), 'rows');
idx3 = ~ismember(B(:,1:end-1), A(:,1:end-1), 'rows');
C(idx1,:) = [A(idx1,:) B(idx2(idx1),end)];
C(~idx1,:) = [A(~idx1,:) zeros(sum(~idx1),1)];
C=[C;B(idx3,1:end-1) zeros(sum(idx3),1) B(idx3,end)];

答案 1 :(得分:1)

您还可以使用intersect进行一些预分配来加速分配(如果M或G变得非常大)。

A=[1 2 3 4 5 100; 6 7 8 9 10 101; 11 12 13 14 15 102];
B=[6 7 8 9 10 103; 15 16 17 18 19 104];
C=[1 2 3 4 5 100 0; 6 7 8 9 10 101 103; 11 12 13 14 16 102 0; 15 16 17 18 19 0 104];

[M,N] = size(A);
G = size(B,1);

[tmp, idxA, idxB] = intersect(A(:,1:end-1),B(:,1:end-1),'rows')
idxBnotA = setdiff([1:G],idxB);

H = M + G - length(idxA);

C1 = zeros(H,N+1);

C1(1:M,1:N) = A;
C1(idxA,end) = B(idxB,end);
C1(M+1:end,1:end-2) = B(idxBnotA,1:end-1);
C1(M+1:end,end) = B(idxBnotA,end)