Fortran 求矩阵的逆、转置、行列式的值

时间:2024-03-23 12:47:18

 

学Fortran的第一天,就写了这么点东西,分享一下。

内容包括:求矩阵的逆、转置、行列式的值

其中:求逆的方法是先求伴随矩阵再除以行列式的值,

求行列式的值用的是求余子式的迭代法(从matlab里面的det函数获得的启发),

转置就不说了,

需要注意的是,Fortran中数组的存储是先列后行。

注释以后有空再加上吧。初学,程序有误或有待改进之处欢迎指正,有问题可以留言

感谢学习过程中帮助比较大的几个帖子及作者:

https://www.tutorialspoint.com/fortran/fortran_arrays.htm

https://blog.csdn.net/encaidx/article/details/7425707

http://bbs.fcode.cn/thread-1240-1-1.html

http://fcode.cn/guide-103-1.html


主程序(文件):

    program main

    use lib_det

    use lib_inv

    use lib_print

    real,dimension(3,3)::A,B

    real::d

    integer::m,n,k

    data m,n,d/3,3,0/

    A=reshape((/1,8,3,4,5,6,7,8,9/),(/3,3/))

    print *,"原矩阵:"

    B=print_a(A,m,n)

    print *,char(10),"转置:"

    B=print_a(tran(A,m,n),m,n)

    print *,char(10),"逆矩阵:"

    B=print_a(inv(A,m),m,n)

    print *,char(10),"行列式的值:"

    print *,det(A,m,n)

    pause

    end program main


行列式的文件内容

    module lib_det

    contains

    recursive function det(A,col,row) result(D)

    integer row,col,idxRows(row-1),idxCOLS(col-1)

    real A(col,row), D

    integer m,n,k,c,f

    m=row

    n=col

    if (m>1) then

        D = 0;

        do k=1,m

            idxCOLS = sitdiff([1:m],m,k);

            idxROWS = [2:n];

            c=col-1

            f=row-1

            D = D + (-1)**(1+k) * A(k,1) *&

                det(A(idxCOLS,idxROWS),c,f)

        end do

    else

        D = A(1,1);

    end if

    end function det

    function sitdiff(A,n,k)

    integer A(:),B(n-1),sitdiff(n-1)

    integer n,d,k

    if(k==1) then

        B=A(k+1:n)

    else if(k==n) then

        B=A(1:k-1)

    else

        B=A((/1:k-1,k+1:n/))

    end if

    sitdiff=B

    end function sitdiff

    end module lib_det


逆矩阵  以及  转置的文件内容

    module lib_inv

    use lib_det

    contains

    function inv(A,row)

    integer row,m(row-1),n(row-1)

    real A(row,row),inv(row,row)

    do i=1,row

        do j=1,row

            m=sitdiff([1:row],row,i)

            n=sitdiff([1:row],row,j)

            inv(i,j)=(-1)**(i+j)*det(A(m,n),row-1,row-1)

        end do

    end do

    inv=inv/det(A,row,row)

    inv=tran(inv,row,row)

    end function inv

    function tran(A,col,row)

    integer row,col

    real tran(row,col),A(col,row)

    do i=1,col

        do j=1,row

            tran(j,i)=A(i,j)

        end do

    end do

    end function tran

    end module lib_inv


将矩阵格式化地显示出来的文件内容

    module lib_print

    contains

    function print_a(A,row,col)

    integer row,col

    real A(row,col)

    do i=1,row

        print *,A([1:col],i)

    end do

    end function print_a

    end module lib_print


Fortran 求矩阵的逆、转置、行列式的值