将C ++代码转换为C#。将double转换为double *的问题

时间:2020-04-12 11:04:21

标签: c# c++ unsafe

我在将C ++代码转换为C#时遇到问题。我不知道如何将double转换为double*

c ++代码

void Kohonen::Initialize()
{
   int i ;
   double *optr ;

   ClearWeights();
   RandomizeWeights();
   for (i=0 ; i<NUMBER_OUTPUT; i++) 
   {
      optr = outputWeights[i];
      NormalizeWeight(optr);
   }
}

c#

unsafe void Initialize()
    {
        int i;
        double* optr;

        ClearWeights();
        RandomizeWeights();
        for (i = 0; i < NUMBER_OUTPUT; i++)
        {
            optr = outputWeights[i,0];
            NormalizeWeight(optr);
        }
    }

作为参考方法NormalizeWeight

unsafe void NormalizeWeight(double* w)

edit1添加更多的c ++代码

void Kohonen::NormalizeWeight(double *w)
{
   int i ;
   double len ;

   len = VectorLength(NUMBER_INPUT, w );
   if (len < 1.e-30)           
      len = 1.e-30 ;

   len = 1.0 / sqrt(len);
   for (i=0; i<NUMBER_INPUT; i++)
      w[i] *= len;
}

double Kohonen::VectorLength (int n, double *vec )
{
   double sum = 0.0;

   for (int i=0;i<n;i++ )
      sum += vec[i] * vec[i];
   return sum;
}

也是这些方法中使用的数组

double outputWeights[NUMBER_OUTPUT][NUMBER_INPUT];

2 个答案:

答案 0 :(得分:0)

如果您使用C# references,该怎么办?

ref关键字指示通过引用传递的值。它在四种不同的上下文中使用:

在方法签名和方法调用中,将参数传递给 参考方法。有关更多信息,请参见传递参数 参考。在方法签名中,通过以下方式将值返回给调用方: 参考。有关更多信息,请参见引用返回值。在一个 成员主体,以指示已存储参考返回值 本地作为调用者打算修改的参考,或 通常,局部变量通过引用访问另一个值。对于 有关更多信息,请参阅Ref locals。在结构声明中声明一个 ref struct或只读ref struct。有关更多信息,请参见 结构类型。

答案 1 :(得分:0)

尝试一下:

如果要使用不安全的上下文:

您可以使用二维数组:

unsafe void Initialize()
{
   int i;
   double[,] outputWeights = new double[NUMBER_OUTPUT,NUMBER_OUTPUT];

   ClearWeights();
   RandomizeWeights();
   fixed(double* pt= outputWeights)
   {
      for(i = 0; i < NUMBER_OUTPUT; i++)
      {
         NormalizeWeight(pt+(i*NUMBER_OUTPUT));
      }
   }
}

所有

unsafe void Initialize()
    {
       int i;
       // Initialize array
       double[][] outputWeights = new double[NUMBER_OUTPUT][];
       for(i = 0; i < NUMBER_OUTPUT; i++)
       {
         outputWeights[i] = new double[NUMBER_OUTPUT];
       } 

       ClearWeights();
       RandomizeWeights();
       for(i = 0; i < NUMBER_OUTPUT; i++)
       {
          fixed(double* pt= outputWeights[i])
          {
             NormalizeWeight(pt);
          }
       }
    }

如果不使用ref关键字:

void NormalizeWeight(ref double[] w)
{
...
}
void Initialize()
{
   ...
   for(i = 0; i < NUMBER_OUTPUT; i++)
   {
       NormalizeWeight(ref outputWeights[i]);
   }
}