【问题标题】:How to initialize an array of structs with another stuct? [closed]如何用另一个结构初始化结构数组? [关闭]
【发布时间】:2013-04-14 19:01:40
【问题描述】:

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

这是我得到的:

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

【问题讨论】:

  • 问题是什么?
  • 您认为您编写的代码有什么问题?它确实存在一些问题,但如果您解释自己而不是我们猜测,它会有所帮助。
  • 如果你使用new而不是malloc,在内存分配后会调用构造方法。构造函数是你应该初始化对象的地方。
  • main.cpp:138:50: error: expected primary-expression before ')' token 这是我得到的错误,它指的是我使用 malloc 的方式,这让我觉得我我没有正确使用 malloc
  • 另一种方法是使用std::vector并在vector的构建过程中复制项目。

标签: c++ machine-learning backpropagation


【解决方案1】:

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

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

【讨论】:

  • 感谢您的澄清。现在可以了。
  • @jamalsabs 我很高兴,尤其是。因为它是神经科学。 :)
【解决方案2】:

Don't use malloc in C++.

作为对现有内容的最小更改,更改以下内容:

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

到这里:

ann.inputLayer = new Neuron[din];

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

(与dout 行相同)

编辑:

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

【讨论】:

  • 没有。也不要使用new[]inputLayer 应该是 std::vector。 (其实我觉得这段代码里不应该有任何指针。)
  • @JamesKanze 我完全同意您的推理,尽管您的建议需要更改未发布的代码。这将是另一天的一个很好的教训。 :)
【解决方案3】:

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

除了正如其他人所说的那样,您应该永远在 C++ 中使用malloc(除非出于与 C 兼容的原因,即您将指针传递给用 C 编写的函数它将调用free)。实际上,在您所展示的小部分中,不应该有任何指针和动态分配:定义您的类型,添加构造函数,当您需要多个时,使用std::vector

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多