2014-04-30 219 views
-1

我想知道做这件事的最短路径,因此提出这个问题,尽管它可以用很多方式完成。合并两个数组Matlab

假设有两个数组

A1 = [x1 y1 
      x2 y2 
      x3 y3 
      0 0 
      0 0 
      0 0 
      0 0 
       ] 

A2 = [a1 b1 
      a2 b2 
      a3 b3 
      a4 b4 
      0 0 
      0 0 
      0 0 
       ] 

现在,如何合并A1和A2在最短的方式,使得

A = [x1 y1 
     x2 y2 
     x3 y3 
     a1 b1 
     a2 b2 
     a3 b3 
     a4 b4] 

上午薄弱时,它来到数组索引。我已经实现了两个for循环和一些if语句来做到这一点,但我觉得有一个最短的方法。你能帮忙吗?

回答

3

这将删除全部为零的行,并将A1放在A2之上。这是可行的,因为max确实是列明智最大值

A=[A1(max(A1')>0,:);A2(max(A2')>0,:)] 
+0

非常感谢你的机智的答案@大卫。我在这里还有另一个问题。你能帮我解决这个问题吗? http://stackoverflow.com/questions/23391249/update-merge-two-arrays-matlab –

2

这应该可能会做你的工作。如果

A1 = 

1  2 
3  4 
5  6 
0  0 
0  0 
0  0 
0  0 

A2 = 

7  8 
9 10 
11 12 
13 14 
0  0 
0  0 
0  0 

然后

[[nonzeros(A1(:,1)),nonzeros(A1(:,2))];[nonzeros(A2(:,1)),nonzeros(A2(:,2))]] returns 

ans = 

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

希望它能帮助。

编辑|注意:如果A1/A2具有[0 x]或[x 0]类型的行,此解决方案将不起作用。

+1

只是一个注释,如果有像'[0 1]'或'[1 0]'这样的行,这将无法正常工作。在这种情况下'find'也可以代替'nonzeros',因为'A1'和'A2'不是稀疏的(反正在OP的例子中)。 – David

+0

是的!它不会。那么这不是一个合适的解决方案。 –

+0

我想这可能是OP想要的,我只是想澄清,如果OP想要做零/零件混合的行。 – David

2

你可以试试这个也一样,如果你想

A1(all(~A1,2), :) = [] 
A2(all(~A2,2), :) = [] 
A3=[A1;A2] 

前两个语句删除所有零填充行。 第三条语句创建您的合并数组。

例如,下面是一个例子。

A1=[1,2;3,4;1,5;0,0;0,0] 
A2=[7,1;6,1;0,0;0,0;0,0;0,0] 
A1(all(~A1,2), :) = [] 
A2(all(~A2,2), :) = [] 
A3=[A1;A2] 

而这里的输出

去除零之前

A1 =

1  2 
3  4 
1  5 
0  0 
0  0 

A2 =

7  1 
6  1 
0  0 
0  0 
0  0 
0  0 

去除零 后A1 =

1  2 
3  4 
1  5 

A2 =

7  1 
6  1 

合并:

A3 =

1  2 
3  4 
1  5 
7  1 
6  1 
+0

非常感谢您的回答。这些是我以后可以使用的宝贵建议。你能帮我解决这个问题吗? @蒂娜玛丽亚http://stackoverflow.com/questions/23391249/update-merge-two-arrays-matlab –

1

尝试这种情况:

A = A1; 
A(A == 0) = A2(A2 ~= 0); 
+0

非常感谢您的答案。这些是我以后可以使用的宝贵建议。 –

1

我觉得这个也属于这里:

A = reshape(nonzeros([A1; A2]),[],2)