You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正计算n×n矩阵行列式的Fortran代码报错问题

修正Fortran矩阵行列式计算代码的错误

修正后的完整代码

module det_mod
    implicit none
contains
    ! Laplace展开计算行列式
    recursive function determinant(matrix) result(laplace_det)
        real, dimension(:,:), intent(in) :: matrix
        integer :: msize(2), i, n
        real :: laplace_det, det
        real, dimension(:,:), allocatable :: cf

        msize = shape(matrix)
        n = msize(1)

        if (n == 1) then
            det = matrix(1,1)
        else
            det = 0.0
            do i = 1, n
                allocate(cf(n-1, n-1))
                cf = cofactor(matrix, i, 1)
                det = det + ((-1)**(i+1)) * matrix(i,1) * determinant(cf)
                deallocate(cf)
            end do
        end if
        laplace_det = det
    end function determinant

    ! 计算余子式(去掉第mI行第mJ列后的子矩阵)
    function cofactor(matrix, mI, mJ) result(cof_mat)
        real, dimension(:,:), intent(in) :: matrix
        integer, intent(in) :: mI, mJ
        integer :: msize(2), i, j, k, l, n
        real, dimension(:,:), allocatable :: cof_mat

        msize = shape(matrix)
        n = msize(1)

        allocate(cof_mat(n-1, n-1))
        k = 1
        do i = 1, n
            if (i /= mI) then
                l = 1
                do j = 1, n
                    if (j /= mJ) then
                        cof_mat(k,l) = matrix(i,j)
                        l = l + 1
                    end if
                end do
                k = k + 1
            end if
        end do
    end function cofactor
end module det_mod

Program determinant_matrix
    use det_mod
    implicit none
    real, dimension(9) :: Aa
    real, dimension(3,3):: A
    real :: D

    integer, dimension(1:2) :: order2 = [2,1]
    Aa = [2.0,9.0,4.0,7.0,5.0,3.0,6.0,1.0,8.0]
    A = reshape(Aa, [3,3], order = order2 )

    D = determinant(A)
    print *, "行列式值为: ", D
end program determinant_matrix

逐个错误的修正说明

  • 错误:Procedure 'determinant' with assumed-shape dummy argument must have an explicit interface
    原因:使用dimension(:,:)这类假定形状数组作为函数参数时,Fortran强制要求提供显式接口,否则编译器无法识别参数的形状信息。
    修正:将两个函数封装到模块det_mod中,主程序通过use det_mod引用模块,编译器会自动为模块内的函数生成合法的显式接口。

  • 错误:Function 'determinant' has no IMPLICIT type
    原因:主程序启用了implicit none,禁止隐式类型推导,但原代码未提前声明determinant函数的返回类型,编译器无法识别其类型。
    修正:通过模块引用函数后,编译器能自动识别函数的返回类型,无需额外手动声明。

  • 错误:Return type mismatch of function 'determinant'
    原因:原代码中determinant函数的返回类型虽通过result(laplace_det)指定,但因缺少显式接口,主程序无法识别该类型,导致赋值时类型不匹配。
    修正:模块内的函数会被编译器正确解析返回类型,彻底解决类型不匹配问题。

  • 错误:Array index at (1) is an array of rank 2
    原因:原determinant函数中错误地将cofactor声明为可分配数组变量,与同名函数冲突,编译器将调用语句中的cofactor当成数组而非函数,进而抛出索引错误。
    修正:删除determinant函数内real, dimension(:,:), allocatable :: ... cofactor这一行,仅保留cf作为存储余子式的数组变量。

  • Warning: Legacy Extension: REAL array index
    原因:原代码中(/2,1/)是旧版Fortran的数组构造器扩展写法,不符合新版标准。
    修正:改用标准方括号形式[2,1],兼容Fortran 2003及后续版本。

内容的提问来源于stack exchange,提问作者Tommy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:16:11