2012-09-16 73 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

相关问题