首先,我对 DOD 的这个概念很陌生,虽然对它很陌生,但从程序员的角度来看,我发现它真的很令人兴奋。
不久前,我为自己制作了一个多层感知器作为 OO 项目,并且由于我现在正在学习 DOD,所以我认为使用这种范例来制作它会很好。
struct Neuron
{
double bias;
double error;
};
struct Layer
{
Neuron* neurons;
double* output;
double** connections;
unsigned numberNeurons;
};
struct Network
{
unsigned numberInput;
double* input;
std::vector<Layer*> hidden;
Layer* output;
};
我知道它可能不是(而且几乎肯定不是)最好的格式,但我试图将我在不同图层数组中使用得更多的东西分开。但是数组的存储方式确实让我很感兴趣,因为它们应该作为一个结构堆叠在一起,以便更快地读取内存(或者我错过了什么?)。如果我没记错的话, new[] 将数组分配在内存中的某个位置,并且只存储指向该位置的指针,而结构中的静态数组将在其空间内分配。
基于此,我想到了制作层(和网络)模板结构:
template<unsigned n_neurons, unsigned n_connections>
struct Layer
{
Neuron neurons[n_neurons];
double output[n_neurons];
double connections[n_neurons][n_connections];
static const unsigned numberNeurons = n_neurons;
};
但是,如果 Layer 变成了这样的东西,是否有任何方法可以制作具有任意数量隐藏层的 Network 可变参数模板?还是我对静态数组的理解是错误的?创建此类数组(和访问时间)之间有什么区别吗?我的钥匙在哪里?