Как обсуждалось в комментариях, я думаю, что подразумеваемый цикл не может быть использован непосредственно для такого рода суммирования.Например, следующий код пытается суммировать p(:,:,k) * c(k)
за k = 1,4
.
program main
implicit none
integer :: p(2,3,4), c(4), ans(2,3), k
p = 1; c = 1
ans(:,:) = ( p(:,:,k) + c(k), k = 1,4 )
print *, "ans = ", ans
end
Но gfortran дает
ans(:,:) = ( p(:,:,k) + c(k), k = 1,4 )
1
Error: Expected a right parenthesis in expression at (1)
, а Intel Fortran дает
test1.f90(7): error #5082: Syntax error, found '=' when expecting one of: .EQV. .NEQV. .XOR. .OR. .AND. .LT. < .LE. <= .EQ. == .NE. /= .GT. > ...
ans(:,:) = ( p(:,:,k) + c(k), k = 1,4 )
------------------------------------^
Итак, я думаю, что лучше всего использовать явный цикл do над k=1,4
.(Я пытался написать несколько строк, но они кажутся менее читабельными ...)
program main
implicit none
integer :: p(2,3,4), c(4), ans1(2,3), ans2(2,3), ans3(2,3), k
!! Dummy data.
c = [ 1, 10, 100, 1000 ]
do k = 1, 4
p(1,:,k) = k
p(2,:,k) = -k
enddo
ans1 = 0
do k = 1, 4
ans1 = ans1 + p(:,:,k) * c(k)
enddo
ans2 = sum( reshape( [( p(:,:,k) * c(k), k=1,4 )], shape(p) ), dim=3 )
ans3 = sum( p * reshape( spread( c, 1, 2*3 ), shape(p) ), dim=3 )
print *, "ans1 = ", ans1
print *, "ans2 = ", ans2
print *, "ans3 = ", ans3
end