好吧,今天我有一个疑问…
我想用fortran语言写这个方程:
当然,我可以采用“经典”的方法,这样写:

 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

但是,由于我是用Fortran编写的,所以我想用一个看起来“更像原始版本”的表达式来编写它,这样,就简洁了我在想:
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>”,但既然我们在讨论Fortran,我想应该有一个简单的(可能是内在的(?)写作的方式。
所以有一种简洁的方法来编写这个表达式,或者我必须采用更难看的方法(两个显式循环)?
编辑:在实际代码中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

最佳答案

怎么办:

do i=1,N
  B(i) = (B(i) - sum( A(i+1:M,i) * B(i+1:M) )) / A(i,i)
enddo

(请注意,我改变了矩阵索引> cc>,FORTRAN是列主!)
当我们对结果使用A时,这个循环必须按升序进行。我不确定是否可以使用B来完成此操作(编译器是否可以选择如何继续?-见Fortran forall restrictions)。
将结果写入新向量forall不会覆盖C,并且可以按任何顺序执行:
forall ( i=1:N )
  C(i) = (B(i) - sum( A(i+1:M,i) * B(i+1:M) )) / A(i,i)
endforall

10-07 16:36
查看更多