Что ж, сегодня я здесь с этим сомнением...
Я хочу написать это уравнение на Фортране:
Конечно, я могу использовать «классический» подход и написать так:
do i=1,N
ac=0.0
do j=i+1,M
ac=ac+A(i,j)*B(j)
enddo
B(i)=(B(i)-ac)/A(i,i)
enddo
Но так как я пишу на Фортране, то хотелось бы написать выражение, похожее на "больше похожее на оригинал" и, таким образом, компактное. Я думал примерно так:
forall(i=1:N,j=i+1:M)
B(i)=(B(i)- <MySummationExpression(A(i,j)*B(j))> )/A(i,i)
endforall
Выражение, которое гораздо больше похоже на оригинал. Но правда в том, что мне трудно найти способ написать выражение суммирования простым и компактным способом. Конечно, я могу написать функцию "real function summation(<expression>,<lower bound>, <upper bound>
)", но поскольку мы говорим о Фортране, я подумал, что должен быть простой (может быть, встроенный (?)) способ ее написания.
Итак, есть ли компактный способ написать это выражение, или я должен выбрать более уродливый способ (два явных цикла)?
EDIT: В реальном коде x
представляет собой двумерный массив с одним решением в каждом столбце. Таким образом, использование встроенной функции sum
, которая до сих пор кажется отличной идеей (как показано в ответе @alexander-vogt), приводит к почти такой же «компактности» кода:
do j=1,size(B,2)
do i=nA,1,-1
B(i,j)=(B(i,j)-sum(A(i,i+1:nA)*B(i+1:nA,j)))/A(i,i)
enddo
enddo