2012-09-16 74 views
2

我有類似以下矩陣的數據: A = [2 5 10 4 10; 2 4 5 1 2; 6 2 1 5 4];如何根據特定行(Matlab)中包含的條件對列進行排序?

A =

2  5 10  4 10 
2  4  5  1  2 
6  2  1  5  4 

我想通過基於以下標準中的最後一行來排序:

如果第一元件之間和第二元件的差值(第三行中)(在第三行)小於或等於2 - 然後移動該列(在這種情況下第二列向右兩列)。然後,對於所有列執行此操作,直到沒有任何兩個元件(最後一行的)是2的差)

乙內=

2  5  4 10 10 
2  4  1  5  2 
6  2  5  1  4 

凡(6-2 = 4)(2-5 = 3 )(5-1 = 4)(1-4 = 3)

最終的最後一行和元素的所有元素之間的差在它旁邊是大於2

任何建議更大?

+0

當兩列之間的差爲小於或等於2,應的列的最右列被比較總是移動**恰好2列到右側**?該算法的逐步解釋將有助於理解你正在嘗試做什麼。第二個示例矩陣在澄清算法時也很有用,因爲'B'可以從'A'到達,只有一個變化:第3列第4列。 – nrz

+0

從最左邊的列開始,我比較最後一列中包含的元素數據行。我在比較6比2,差異大於2,所以在第二列 - 第二列和第三列小於 - 時,第二列移動到第四列。此時沒有兩個元素的差異小於2,因此它是完整的。 – Kenny

+0

澄清 - 算法的唯一目的是確保最後一行中相鄰元素之間的差異不小於或等於2. – Kenny

回答

2

這是一個可能的解決方案:

A = [2 5 10 4 10; 2 4 5 1 2; 6 2 1 5 4]; 

B = A; 

MatrixWidth = size(A, 2); 

CurIndex = 1; 

%# The second-last pair of the bottom row is the last pair to be compared. 
while(CurIndex+2 <= MatrixWidth) 
    Difference = abs(A(3,CurIndex) - A(3,CurIndex+1)); 

    %# If the right side of comparison is not yet the second-last index. 
    if ((Difference <= 2) && (CurIndex+3 <= MatrixWidth)) 
     B = [ B(:, 1:CurIndex), B(:, CurIndex+2), B(:, CurIndex+1), B(:, CurIndex+3:end) ]; 
    %# If the right side of the comparison is already the second-last index. 
    elseif (Difference <= 2) 
     B = [ B(:, 1:CurIndex), B(:, CurIndex+2), B(:, CurIndex+1) ]; 
    end 

    CurIndex = CurIndex + 1; 
end 
+0

謝謝!這正是我所期待的! – Kenny

+0

不客氣。如果此解決方案適用於您,您可以將其標記爲已接受的答案(綠色的「已接受」標記變爲可見)。 – nrz

+0

會這樣做。再次感謝!我沒有看到接受的商標,但會回頭查看。 – Kenny

相關問題