gpt4 book ai didi

c# - Fortran90 到 C# 的转换问题

转载 作者:太空狗 更新时间:2023-10-29 23:01:47 24 4
gpt4 key购买 nike

我正在将一些 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 的语法使用 MASK,所以很明显我的语句没有使用此函数。

任何见解或帮助将不胜感激。谢谢。

最佳答案

如果您分解这些部分并打印它们,您会注意到这些只是使用简洁的矢量化术语创建的术语:

! 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 个参数。第二个参数(要使用的维度)和第三个参数(数组掩码)不是必需的。

此时很明显,第一个产品实际上是 -1m-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);

关于c# - Fortran90 到 C# 的转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com