我在将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# references怎么办?
ref关键字指示通过引用传递的值。它在四种不同的上下文中使用:
在方法签名和方法调用中,将参数传递给参考方法。有关更多信息,请参见传递参数参考。在方法签名中,通过以下方式将值返回给调用方:参考。有关更多信息,请参见引用返回值。在一个成员主体,以指示已存储参考返回值本地作为呼叫者打算修改的参考,或通常,局部变量通过引用访问另一个值。对于有关更多信息,请参阅参考本地人。在结构声明中声明一个ref struct或只读ref struct。有关更多信息,请参见结构类型。
尝试一下:
如果您要使用不安全的上下文:
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);
}
}
}