对从zgeev获得的eigensystem进行排序

时间:2012-01-12 11:48:41

标签: sorting fortran lapack

我正在使用Lapack例程zgeev来获得(复数)特征值和 Fortran中非对称复矩阵的特征向量。结果数组 特征向量的任意顺序。我想重新排序 特征值数组和特征向量矩阵中的相应列 因此,特征值相对于实部的升序是按升序排列的 每个特征值。我当然可以推出自己的排序程序,但我当时就是 想知道是否已经有一个可以做到这一点的Fortran例程 我,甚至可能是lapack的一部分。

2 个答案:

答案 0 :(得分:0)

你可以看一下zsteqr.f(hermitian tridigaonal solver)的结尾并概括一下。相关的代码位是

*        Use Selection Sort to minimize swaps of eigenvectors
*
         DO 180 II = 2, N
            I = II - 1
            K = I
            P = D( I )
            DO 170 J = II, N
               IF( D( J ).LT.P ) THEN
                  K = J
                  P = D( J )
               END IF
  170       CONTINUE
            IF( K.NE.I ) THEN
               D( K ) = D( I )
               D( I ) = P
               CALL ZSWAP( N, Z( 1, I ), 1, Z( 1, K ), 1 )
            END IF
  180    CONTINUE

所以我认为你只需要更改比较线(但未经测试)

伊恩

答案 1 :(得分:0)

我几天前写了一篇,但是根据实际值进行了排序。这是Quicksort的一个实现。确保输入要用作排序键的功能。

RECURSIVE SUBROUTINE ZQSORT(N,ARRAY)
  IMPLICIT NONE
  INTEGER(4), INTENT(IN)    :: N
  COMPLEX(8), INTENT(INOUT) :: ARRAY(N)
  complex(8)                   :: PIVOT
  COMPLEX(8)                :: TEMP
  INTEGER(4)                :: LEFT,RIGHT

  IF (N.GT.1) THEN
     PIVOT=ARRAY(N/2) !INTEGER DIVISION
     LEFT=1
     RIGHT=N
     DO WHILE (LEFT.LE.RIGHT)
        DO WHILE (REAL(ARRAY(LEFT)).LT.REAL(PIVOT)) !REAL(Z) IS THE KEY USED FOR SORTING HERE
           LEFT=LEFT+1
        END DO
        DO WHILE (REAL(ARRAY(RIGHT)).GT.REAL(PIVOT))! AGAIN KEY APPEARS HERE
           RIGHT=RIGHT-1
        END DO
        IF (LEFT.LE.RIGHT) THEN
           TEMP=ARRAY(LEFT)           !
           ARRAY(LEFT) = ARRAY(RIGHT) !SWAPPING THE ELEMENTS WITH INDICES LEFT<-->RIGHT
           ARRAY(RIGHT)= TEMP         !
           LEFT = LEFT+1
           RIGHT= RIGHT-1
        END IF
        CALL ZQSORT(RIGHT,ARRAY(1:RIGHT))
        CALL ZQSORT(N-LEFT+1,ARRAY(LEFT:N))
     END DO
  END IF
  RETURN
END SUBROUTINE ZQSORT