2014-04-30 254 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)