首页 > 解决方案 > 如何避免在 Fortran 中切换矩阵索引的循环?

问题描述

我想知道是否可以在没有 do 循环的情况下重现以下 MWE。当然,在这个简单的示例中,我可以手动进行以避免 do 循环,因为矩阵MatA,MatBx并且MatBy只有 2 乘 2,但在我的实际情况下,矩阵可能要大得多。

PROGRAM MAIN 

   implicit none
   real, dimension(2,2) :: MatA
   integer, dimension(2,2) :: MatBx
   integer, dimension(2,2) :: MatBy
   real, dimension(2,2) :: MatC
   integer :: x,y


   MatC=0.

   MatA(1,1)=10
   MatA(1,2)=20
   MatA(2,1)=30
   MatA(2,2)=40

   MatBx(1,1)=1
   MatBx(1,2)=2
   MatBx(2,1)=1
   MatBx(2,2)=1

   MatBy(1,1)=1
   MatBy(1,2)=1
   MatBy(2,1)=2
   MatBy(2,2)=1

   Print*, MatA  

   do y=1,2
      do x=1,2
         MatC(x,y)= MatA(MatBx(x,y), MatBy(x,y))      
      enddo
   enddo

   Print*, MatC

END PROGRAM MAIN

使用命令执行:

user$ gfortran -o progtest test.f90 && ./progtest 
   10.0000000       30.0000000       20.0000000       40.0000000    
   10.0000000       20.0000000       30.0000000       10.0000000    

所以我想知道是否可以直接对整个矩阵的索引执行这种操作:类似于MatC(:,:)= MatA(MatBx(:,:), MatBy(:,:))(不起作用)。

精度

一些可能有助于理解一般情况的精度:

在一般情况下,矩阵可以是 NxM 而不是 2x2。

一般操作是根据名为 的传输矩阵从MatA到发送信息。的所有元素都不需要被 接收:在上面的例子中,元素不是被 接收的。MatCMatBMatAMatCMatA(2,2)MatC

标签: fortranfortran95

解决方案


推荐阅读