我正在使用 Lapack 例程zgeev来获取 Fortran 中非对称复数矩阵的(复数)特征值和特征向量。得到的特征向量数组具有任意顺序。我想重新排序特征值数组和特征向量矩阵中的相应列,以便特征值相对于每个特征值的实部按升序排列。我当然可以推出自己的排序例程,但我想知道是否已经有一个 Fortran 例程可以为我做这件事,甚至可能作为 lapack 的一部分。
问问题
1730 次
2 回答
0
您可以只查看 zsteqr.f (厄米特三重解算器)的末尾并对其进行概括。相关的代码是
* 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
所以我认为你只需要改变比较线(但未经测试)
伊恩
于 2012-01-13T12:01:36.460 回答
0
前几天写了一篇,不过排序是按照真实值来的。这是快速排序的一个实现。确保输入要用作排序键的功能。
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
于 2013-11-12T18:35:41.320 回答