Fortran在科學計算方面有強大運算能力,主要是體現在矩陣上,Fortran專門為矩陣的應用設計了很多專用函數。
對于一個矩陣的轉置矩陣,簡單來講,就是行變列。如果用标準程序來寫,就是兩個循環,然後行列交換。有矩陣A,它的轉置矩陣為矩陣B。
do i=1,im
do j=1,jm
b(j,i)=a(i,j)
end do
end do
Fortran專門有矩陣轉置的函數。b=transpose(a)。這和上面的代碼是等效的。
兩個矩陣相乘,要求隻有在第一個矩陣的列數(column)和第二個矩陣的行數(row)相同時才有意義。
矩陣A*矩陣B=矩陣C
矩陣相乘結果滿足如下公式:
用标準代碼就是:
do i=1,im
do j=1,im
c(i,j)=0
do k=1,jm
c(i,j)=c(i,j) a(i,k)*b(k,j)
end do
end do
end do
Fortran專門有矩陣相乘的函數。c=matmul(a,b)。這和上面代碼是等效的。
我們做一個練習,把一個3*3矩陣A,分别通過代碼和函數公式求出轉置矩陣B,然後再分别通過代碼和函數公式計算A,B相乘得到矩陣C。
program test70
implicit none
integer,parameter::im=3,jm=3
integer::i,j,k
integer::a(im,jm),b(jm,im),c(im,im)=0
data a &
/1,2,3,&
5,9,4,&
7,2,6/
write(*,*)"矩陣A:"
write(*,"(3i2)")a
write(*,'(60("-"))')
do i=1,im
do j=1,jm
b(j,i)=a(i,j)
end do
end do
write(*,*)"循環求矩陣B:"
write(*,"(3i2)")b
write(*,'(60("-"))')
b=transpose(a)
write(*,*)"公式求矩陣B:"
write(*,"(3i2)")b
write(*,'(60("-"))')
do i=1,im
do j=1,im
c(i,j)=0
do k=1,jm
c(i,j)=c(i,j) a(i,k)*b(k,j)
end do
end do
end do
write(*,*)"循環求矩陣A*B:"
write(*,"(3i4)")c
write(*,'(60("-"))')
c=matmul(a,b)
write(*,*)"公式求矩陣A*B:"
write(*,"(3i4)")c
write(*,'(60("-"))')
pause
stop
end program test70
運行程序,結果如下:(Fortran矩陣順序是先列後行)
運行結果
Fortran中兩個矩陣可以直接相加,相減。大大提高了運行效率。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!