我正在将一些Fortran90代码转换为C#。我对Fortran77有一些了解,但对Fortran90不熟悉。我遇到了以下代码行,我不确定如何翻译。
C1 = real(product((/(-1,i1=1,m-1)/))*product((/(i1,i1=2,m)/)))
我认为这应该转换为:
int product1 = -1; int product2 = 1;
for (int i1 = 1 ; i1 <= (m-1); i1++)
{
product1 *= -1;
}
for (int i2 = 2, i2 <= m; i2++)
{
product2 *= i2;
}
float C1 = (float)(product1 * product2);
我的不确定性源于这样一个事实:存在一个隐含的do循环结构用于初始化数组;即。
A = (/2*I, I = 1,5/)
但是我从来没有见过Fortran声明中使用的“product”这个词。我知道有一个称为PRODUCT的向量或矩阵乘法的内在函数,但“产品”不是我正在使用的代码中的数组,并且内在函数PRODUCT的语法使用MASK,因此我的声明显然没有使用此函数。 / p>
非常感谢任何见解或帮助。谢谢。
答案 0 :(得分:7)
如果您分解并打印它们,您会发现这些只是使用简洁的矢量化术语创建的术语:
! given: (/(expr, start, end)/)
!
! (/(-1, i1=1, m-1)/) = vector, -1 repeated m-1 times
!
! (/(i1, i1=2, m)/) = vector, 2..m
!
! Both are vectors with m-1 terms
另一点需要注意的是product()
不需要3个参数。
此时很明显,第一个产品实际上是-1
m-1
,第二个产品是m!
。
因此,正确(但不一定有效)的翻译可能是:
// product((/(-1,i1=1,m-1)/)) => -1^m-1
double i = (m % 2 == 0 ? -1 : 1);
// product((/(i1,i1=2,m)/)) => m!
double mfact = i;
for (int jj = 2; jj < m; ++jj)
{
mfact *= jj;
} // C1 = mfact;
简洁,与F90接近“精神”,但效率不高:
double i = (m % 2 == 0 ? -1 : 1);
double C1 = Enumerable.Range(2, m)
.Aggregate(i, (x, y) => x * y);