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