Как избежать l oop для переключения индекса матрицы в Фортране? - PullRequest
0 голосов
/ 15 февраля 2020

Я хотел бы знать, возможно ли воспроизвести следующие MWE без циклов do. Конечно, в этом упрощенном примере c я могу сделать это вручную, чтобы избежать do l oop, поскольку матрицы 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.

...