Преобразование кода C ++ в C#. Проблема с преобразованием двойного в двойное * - PullRequest
0 голосов
/ 12 апреля 2020

У меня проблема с преобразованием кода 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 ]

1 голос
/ 12 апреля 2020

Попробуйте:

, если вы хотите использовать небезопасный контекст:

, вы можете использовать двумерный массив:

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

Allso

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]);
   }
}
0 голосов
/ 12 апреля 2020

Что, если вы используете C# ссылки ?

Ключевое слово ref указывает значение, которое передается по ссылке. Он используется в четырех различных контекстах:

В сигнатуре метода и в вызове метода для передачи аргумента в метод по ссылке. Для получения дополнительной информации см. Передача аргумента по ссылке. В сигнатуре метода, чтобы вернуть значение вызывающей стороне по ссылке. Для получения дополнительной информации см. Справочные возвращаемые значения. В теле члена указывать, что возвращаемое значение ссылки хранится локально в качестве ссылки, которую вызывающий объект намерен изменить, или, как правило, локальная переменная обращается к другому значению по ссылке. Для получения дополнительной информации см. Ref locals. В объявлении структуры для объявления ref-структуры или только для чтения ref-структуры. Для получения дополнительной информации см. Ref struct types.

...