我在将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结构。有关更多信息,请参阅参考结构类型。