将C++代码转换为C#.将double转换为double时出现问题*



我在将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];

试试这个:

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

你可以使用二维阵列:

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

如果使用C#引用会怎样?

ref关键字表示通过引用传递的值。它用于四种不同的上下文:

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

最新更新