2013-04-14 8 views
-2

Здравствуйте, я пишу алгоритм для обратного распространения в 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]; 
} 

дин представляет число нейронов в моем входном слое. dhid представляет количество нейронов в моем скрытом слое. dout repreesnts количество нейронов в моем выходном слое. я не утруждать показывает инициализацию моего скрытого слоя причиной его не важно спасибо

я написал // ERROR на линиях, где ошибки показаны в соответствии с моей IDE (NetBeans)

+0

В чем вопрос? –

+0

Что вы думаете о неправильном написании кода? У него есть некоторые проблемы, но это помогает, если вы объясняете себя, а не догадываетесь. – john

+0

Если вы используете 'new' вместо' malloc', метод конструктора будет вызываться после выделения памяти. Конструктор - это то, где вы должны инициализировать объекты. –

ответ

1

Don't use malloc in C++.

Как минимальное изменение к тому, что у вас есть, изменить:

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

Для этого:

ann.inputLayer = new Neuron[din]; 

new здесь более понятным для читателей вашего кода, выполняет строительство в случае необходимости , и возвращает правильный тип указателя.

(То же самое с dout линии)

Edit:

Вы также, вероятно, найти std::vectorмного легче управлять над указателями.

+0

Нет. Не используйте 'new []'. 'inputLayer' должен быть' std :: vector'. (На самом деле, я не думаю, что в этом коде должны быть указатели.) –

+0

@JamesKanze Я полностью согласен с вашими рассуждениями, хотя ваше предложение потребует изменений в неопубликованном коде. Это был бы хороший урок на другой день. :) –

2

Во-первых, вы не хотите, чтобы сделать инициализацию по умолчанию в вызывающий код, вы можете создать конструктор для вашей структуры и сделать это там:

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

вы должны использовать new над malloc в C++, хотя, если вы когда-либо было нужно malloc ваше заявление должны быть исправлены, чтобы:

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

Благодарим вас за разъяснение. Он работает сейчас. – jamalsabs

+0

@jamalsabs Мое удовольствие, особенно. так как это неврология. :) –

0

Только для записи: причина, по которой вы получаете ошибки, заключается в том, что вы компилируете код C с помощью компилятора C++. malloc возвращает void*. В C это неявно преобразуется в любой другой тип указателя; в C++ требуется явное преобразование.

За исключением, что, как говорят другие, а также, вы должны никогда использование malloc в C++ (если не по причинам совместимости с C — т.е. вы передаете указатель на функцию, написанной в C, который будет вызывать free на него). Фактически, в том, что вы показали, не должно быть указателей и никакого динамического распределения: определите свои типы, добавьте конструкторы, и когда вам нужно больше одного, используйте std::vector.

Смежные вопросы