fortran - 如何避免在 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
到发送信息。的所有元素都不需要被 接收:在上面的例子中,元素不是被 接收的。MatC
MatB
MatA
MatC
MatA(2,2)
MatC