Fortran矩陣轉置和乘法運算
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
矩陣相乘結果滿足如下公式:
C11=A11B11+A12B21
C12=A11B12+A12B22
C21=A21B11+A22B21
C22=A21B12+A22B22
用標準程式碼就是:
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 stopend program test70
執行程式,結果如下:(Fortran矩陣順序是先列後行)
執行結果
Fortran中兩個矩陣可以直接相加,相減。大大提高了執行效率。