二阶矩阵转置怎么求_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)相同时才有意义。

6d825d4080ccd2840fc0de80a3d93473.png

矩阵A*矩阵B=矩阵C

矩阵相乘结果满足如下公式:

  1. C11=A11B11+A12B21
  2. C12=A11B12+A12B22
  3. C21=A21B11+A22B21
  4. 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矩阵顺序是先列后行)

ff784dd1554522faed843304d8341306.png

运行结果

Fortran中两个矩阵可以直接相加,相减。大大提高了运行效率。

2d0aedd7df6d96397d2ecd0c2d10f6f8.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值