学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