Matrix 如何使用Fortran 77计算矩阵的对数?
我必须在Fortran 77程序中计算3x3矩阵(a)的对数 在Python中,我使用了Matrix 如何使用Fortran 77计算矩阵的对数?,matrix,fortran,linear-algebra,logarithm,intel-mkl,Matrix,Fortran,Linear Algebra,Logarithm,Intel Mkl,我必须在Fortran 77程序中计算3x3矩阵(a)的对数 在Python中,我使用了 scipy.linalg.logm(A) 对于这项工作,但我没有找到一个解决方案,这项任务在Fortran 到目前为止,我发现使用Fortran 77的内置函数无法执行此操作。我还搜索了英特尔数学内核库的文档,但没有找到合适的子程序。我在NAG Fortran库中找到了子例程F01EJ,但不幸的是,我无法访问这个商业库。我知道Higham等人的论文,但我想避免自己实现算法,因为我认为这必须是一个解决的问题
scipy.linalg.logm(A)
对于这项工作,但我没有找到一个解决方案,这项任务在Fortran
到目前为止,我发现使用Fortran 77的内置函数无法执行此操作。我还搜索了英特尔数学内核库的文档,但没有找到合适的子程序。我在NAG Fortran库中找到了子例程F01EJ,但不幸的是,我无法访问这个商业库。我知道Higham等人的论文,但我想避免自己实现算法,因为我认为这必须是一个解决的问题
谁能给我一个提示,让我知道计算矩阵对数的子程序
解决方案:
根据@kvantour提出的方法,我已经实现了一个3x3矩阵对数的子程序,它对我来说很好。子例程的快速而肮脏的代码可能对具有相同问题的其他人有用:
subroutine calclogM(M,logM)
implicit none
double precision,dimension(3,3)::M,logM,VL,VR,logMapo,VRinv
integer::n,INFO,LWORK,I,J
double precision,dimension(3)::WR,WI,logWR,ipiv
double precision,dimension(24)::WORK
n=3
LWORK=24
call DGEEV( 'N', 'V', n, M, n, WR, WI, VL, n, VR,
1 n, WORK, LWORK, INFO )
C Check if all eigenvalues are greater than zero
if (WR(1) .le. 0.D0) then
write(*,*) 'Unable to compute matrix logarithm!'
GOTO 111
end if
if (WR(2) .le. 0.D0) then
write(*,*) 'Unable to compute matrix logarithm!'
GOTO 111
end if
if (WR(3) .le. 0.D0) then
write(*,*) 'Unable to compute matrix logarithm!'
GOTO 111
end if
DO I = 1, 3
DO J = 1, 3
logMapo(I,J) = 0.D0
END DO
END DO
C Then Mapo will be a diagonal matrix whose diagonal elements
C are eigenvalues of M. Replace each diagonal element of Mapo by its
C (natural) logarithm in order to obtain logMapo.
DO I = 1, 3
LogMapo(I,I)=log(WR(I))
END DO
C Calculate inverse of V with LU Factorisation
C Copy VR to VRinv
DO I = 1, 3
DO J = 1, 3
VRinv(I,J) = VR(I,J)
END DO
END DO
call dgetrf( n, n, VRinv, n, ipiv, info )
write(*,*) 'INFO',INFO
call dgetri( n, VRinv, n, ipiv, WORK, LWORK, INFO )
write(*,*) 'INFO',INFO
C Build the logM Matrix
logM = matmul(matmul(VR,logMapo),VRinv)
111 end subroutine calclogM
为了计算矩阵的对数,需要计算原始矩阵的特征值λ{1,2,3}。如果所有特征值都大于零,则可以计算对数 因此,我将采取以下步骤:
Log
最好的方法是尝试自己实现特征分解,因为它只是一个3x3矩阵。为了计算矩阵的对数,需要计算原始矩阵的特征值λ{1,2,3}。如果所有特征值都大于零,则可以计算对数 因此,我将采取以下步骤:
Log
最好的方法是尝试自己实现特征分解,因为它只是一个3x3矩阵。欢迎,请记住接受欢迎并阅读。不幸的是,Fortran中没有这样的内在函数,推荐一个外部库在这里是不合适的。我想,如果您搜索,您可能会找到Fortran实现,但为您搜索它们是离题的。但也许它们太新了,没有Fortran实现。你可以找到C或C++的一个,并从FORTRAN调用它。C++的特征库有矩阵对数,你可能想尝试从FORTRAN调用它。这需要您编写一些接口C++代码。更多的阅读感谢您的建议与C++特征库。我将尝试一下,看看是否能够从我的Fortran代码调用该函数。欢迎,请记住接受欢迎并阅读。不幸的是,Fortran中没有这样的内在函数,推荐一个外部库在这里是不合适的。我想,如果您搜索,您可能会找到Fortran实现,但为您搜索它们是离题的。但也许它们太新了,没有Fortran实现。你可以找到C或C++的一个,并从FORTRAN调用它。C++的特征库有矩阵对数,你可能想尝试从FORTRAN调用它。这需要您编写一些接口C++代码。更多的阅读感谢您的建议与C++特征库。我将尝试一下,看看是否能够从Fortran代码中调用该函数。3x3矩阵的特征值可以直接计算。我已经按照@kvantour提出的方法实现了矩阵对数的子例程,结果很好。将我的代码发布到这里对其他人有帮助吗?@MechanicalOlli这样做没有害处。我会把它放在原始问题中(通过编辑)。其他人肯定会从中受益。3x3矩阵的特征值可以直接计算。我已经按照@kvantour提出的方法实现了矩阵对数的子例程,结果很好。将我的代码发布到这里对其他人有帮助吗?@MechanicalOlli这样做没有害处。我会把它放在原始问题中(通过编辑)。其他人肯定会从中受益。