好吧,今天我有一个疑问…
我想用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