0

我正在将 C++ 代码转换为 C# 代码,它恰好是频域中图像的快速傅里叶变换。只是为了提供一些背景。

这是 C++ 代码的链接:fft.cc

我有一个名为 Step 的函数,它在 C++ 中的签名是这样的:

void step ( int n, int mj, float a[], float b[], float c[], float d[], float w[], float sgn );

并被称为:

step ( n, mj, &x[0*2+0], &x[(n/2)*2+0], &y[0*2+0], &y[mj*2+0], w, sgn );

我想将其转换为 C#,现在此函数在 Y 或 X 数组上运行,具体取决于它是正向快速傅里叶变换还是反向快速傅里叶变换。(更多上下文)

我不明白的是,在 C# 中,什么都不做x[0*2+0]......首先将一个整数放在方括号中实际上会调用该数组中某个位置的变量。

但是它在 C++ 中做了什么,我知道它&等同于refC# 关键字,它是说从被指向的数组中获取内容,但我觉得在这种情况下它意味着更多。

那么你将如何在 C# 中调用该函数,显然这会失败:

step(n, mj, x[0 * 2 + 0], x[(n / 2) * 2 + 0], y[0 * 2 + 0], y[mj * 2 + 0], w, sgn);
4

3 回答 3

2

在 C++ 中,这是将数组条目的地址传递给函数。这在 C# 中不起作用,因为您不能获取数组条目的地址。我建议重写声明以仅传递索引并单独传递数组。或者使 x 和 y 数组成为包含类的成员。

呃,或者如果你只对单个元素感兴趣,你可以传递元素。请记住,C++ 中的 float b[] 与 float* b 相同,因此如果 skip 只访问 b[0](而不是 [b+1]),那么这可能是更简单的解决方案)。

当我们有一个像这样的 C++ 声明时

void step (float a[]) 

这与

void step (float* a)

我们称之为

step(&x[2]);

函数步骤会看到一个浮点数组,该数组从 x 的第二个条目开始。所以,内步

float f = a[0];

将引用 x[2] 处的元素;

当然,也可以处理a[27],但这很容易出错,因为我们不知道 x 的(剩余)长度。

在这种情况下,为了帮助找到最佳解决方案,需要知道哪些步骤对参数进行了处理。是否可以发布步骤功能或部分功能?

于 2013-11-04T12:43:36.863 回答
0

删除地址,除了使其成为具有更改值或返回值的函数的类之外,无法更改值。而不是float a[]使用float[] a

这是你的函数的样子,不需要标题:

public class entity
{
    public void Step(int n, int mj, float a[], float[] b, float[] c, float[] d, float[] w, float sgn)
    {
       ...
    }

    Step(0, 0, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, 1f);
}
于 2013-11-04T12:48:04.393 回答
0

C++ 版本允许您将指针(想想引用)传递给数据中的某些元素。

对于 C# 版本,我建议你直接传入两个数组,然后只传入索引,所以

 void step ( int n, int mj, float a[], float b[], float c[], float d[], 
      float w[], float sgn );

变成

void Step(float[] x, float[] y, int n, int mj, int ai, int bi, int ci, int di,
     int w, float sign)
{ 
      float a = x[ai];
      float b = x[bi];
      float y = y[ci];

      // .... compute whatever


     x[ai] = a;
     x[bi] = b;
     //...
}

如果你在 C++ 函数中遇到类似 a[5] 的东西,你可以简单地使用

float aa = x[ai+5];

但是,如果有必要,您当然需要考虑将新值写回。

于 2013-11-04T13:09:55.630 回答