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)相同時才有意義。

Fortran矩陣轉置和乘法運算

矩陣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矩陣轉置和乘法運算

執行結果

Fortran中兩個矩陣可以直接相加,相減。大大提高了執行效率。

Fortran矩陣轉置和乘法運算