如何用另一个结构初始化一个结构数组?

时间:2013-04-14 19:01:41

标签: c++ machine-learning backpropagation

您好我正在编写一个c ++反向传播算法,它由1个输入层1隐藏层和1个输出层组成。 我很好奇如何初始化我的inputlayer,hiddenlayer和outputlayer。

这就是我得到的:

struct Neuron {
double activation;
double bias;
double *incomingWeights;
};

struct Network {
double *targetLayer;
Neuron *inputLayer;
Neuron *hiddenLayer;
Neuron *outputLayer;
};

ann.inputLayer = malloc(din * sizeof * Neuron); //ERROR
for (int i = 0; i < din; i++) {
    ann.inputLayer[i].activation = 0;
    ann.inputLayer[i].bias = 0;
    ann.inputLayer[i].incomingWeights = NULL;
}

ann.outputLayer = malloc(dout * sizeof * Neuron); //ERROR
for (int i = 0; i < dout; i++) {
    ann.outputLayer[i].activation = 0;
    ann.outputLayer[i].bias = 0;
    ann.outputLayer[i].incomingWeights = new double[dhid];
}

din表示输入图层中的神经元数量。 dhid表示隐藏层中的神经元数量。 dout表示输出层中的神经元数量。 我没有打扰显示我的隐藏层的初始化导致它不重要 谢谢

我根据我的IDE(netbeans)

在错误显示的行上写了// ERROR

3 个答案:

答案 0 :(得分:2)

首先,你永远不想在调用代码时进行默认初始化,你可以为你的struct创建一个构造函数并在那里执行:

struct Neuron {
   Neuron() : activation(0.0), bias(0.0), incomingWeights(0) {}
   double activation;
   double bias;
   double *incomingWeights;
};

然后(因为这是C ++)

for (int i = 0; i < din; i++) {
   ann.inputLayer[i] = new Neuron[din]; 

您应该在C ++中使用new而不是malloc,但如果您确实需要malloc,则需要修复您的陈述,以便:

ann.inputLayer = (Neuron*)malloc(din * sizeof(Neuron)); 

答案 1 :(得分:1)

Don't use malloc in C++

作为对您所拥有的的最小改动,请更改此:

ann.inputLayer = malloc(din * sizeof * Neuron);

对此:

ann.inputLayer = new Neuron[din];

new这里对于您的代码的读者更清楚,在需要时执行构造,并返回正确的指针类型。

(与dout行相同)

编辑:

您还可能会发现std::vector 更容易管理指针。

答案 2 :(得分:0)

仅供记录:您遇到错误的原因是因为您正在使用C ++编译器编译C代码。 malloc会返回void*。在C中,这隐式转换为任何其他指针类型;在C ++中,您需要一个显式转换。

除此之外,正如其他人所说,你应该从不在C ++中使用malloc(除非出于与C兼容的原因 - 即你将指针传递给写入的函数在C中将调用free。实际上,在你所展示的那些中,应该没有指针,也没有动态分配:定义你的类型,添加构造函数,当你需要多个时,使用std::vector