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

问题描述 投票:0回答:2

我在将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];
c# c++ unsafe
2个回答
0
投票

如果使用C# references怎么办?

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

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


0
投票

尝试一下:

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

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]);
   }
}

因此您可以使用二维数组:

double [,] outputWeights =新的double [NUMBER_OUTPUT,NUMBER_OUTPUT];

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);
      }
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.