我已经训练了一个简单的神经网络,该神经网络仅将4个数字相乘并给出1个数字作为输出。
( output(x0) = in1(x0)*in2(x0)*in3(x0) *in4(x0)).
我的神经网络有4个输入和1个输出,[10 10]是隐藏层。我使用'genFunction'生成了网络之外的.m文件,然后使用MATLAB编码器生成了C ++函数。我使用以下输入类型生成代码:
输入类型:
我的问题是,当我测试C ++代码时,它仅给出输出的前两个样本。
我将条目存储在大小为400(每个输入大小为100)的std ::向量中
到目前为止,我已经完成了以下操作(尽管没有令人满意的输出):
std::vector<double> Multiplier(std::vector<double>& input)
{
double* X_data = new double[input.size()];
X_data = vec2ar(input);
int X_size[2];
X_size[0] = 4;
X_size[1] = 100;
double* Y_data = new double[input.size()];
int Y_size[100];
原件是:
void multiplier(const double X_data[], const int X_size[2], double Y_data[], int
Y_size[2])
{
double Xp1_data[800];
int Xp1_size[2];
int j;
double a1_data[2000];
int coffset;
int a1_size[2];
int boffset;
double tmp_data[2000];
int k;
double b_a1_data[2000];
并获取输出:
std::vector<double> output;
output = ar2vec(Y_data);
return output;
我想要的就是我们有4个向量,并将它们赋予此功能,只需将相应的样本相乘即可,如“描述”中所示(在我的情况下,我们有4个大小为100的向量,我们期望输出大小为100)。
对于ar2vec和vec2ar函数:
std::vector<double> ar2vec(double arr[])
{
std::vector<double> vec;
copy(&arr[0], &arr[100], std::back_inserter(vec));
return vec;
}
double* vec2ar(std::vector<double> vec)
{
double * arr = new double[vec.size()];
copy(vec.begin(), vec.end(), arr);
return arr;
}
如何解决我的问题?
答案 0 :(得分:0)
默认情况下,MATLAB Coder会生成按列主顺序存储矩阵和ND数组的代码。 C和C ++中的典型布局是行主要顺序。为了确保正确的行为,在调用生成的代码之前,必须先将数据从行专业转换为列专业,然后再返回至行专业以使用输出。
从MATLAB R2018a开始,MATLAB Coder提供了生成行主代码的选项。如果您的代码已经按行主顺序存储数据,则启用此设置将使您无需转换大多数数据。 release notes对此进行了描述,documentation的一部分描述了MATLAB Coder中的这些选项。