Я хотел бы знать, возможно ли воспроизвести следующие 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
.