Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matrix 如何使用Fortran 77计算矩阵的对数?_Matrix_Fortran_Linear Algebra_Logarithm_Intel Mkl - Fatal编程技术网

Matrix 如何使用Fortran 77计算矩阵的对数?

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等人的论文,但我想避免自己实现算法,因为我认为这必须是一个解决的问题

我必须在Fortran 77程序中计算3x3矩阵(a)的对数

在Python中,我使用了

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}。如果所有特征值都大于零,则可以计算对数

因此,我将采取以下步骤:

  • 计算特征值λ{1,2,3}及其相应的特征向量v{1,2,3}
  • 检查所有特征值是否大于零
  • 如果满足条件(2),计算特征值的
    Log
  • 使用对数值,用特征向量重构矩阵
  • 计算矩阵的特征向量和特征值的简单方法可以在(查看旧书部分)中找到。更高级的方法可以基于-您对例程感兴趣


    最好的方法是尝试自己实现特征分解,因为它只是一个3x3矩阵。

    为了计算矩阵的对数,需要计算原始矩阵的特征值λ{1,2,3}。如果所有特征值都大于零,则可以计算对数

    因此,我将采取以下步骤:

  • 计算特征值λ{1,2,3}及其相应的特征向量v{1,2,3}
  • 检查所有特征值是否大于零
  • 如果满足条件(2),计算特征值的
    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这样做没有害处。我会把它放在原始问题中(通过编辑)。其他人肯定会从中受益。