如何使用MATLAB编码器将经过训练的神经网络用作函数?

时间:2018-11-14 06:43:21

标签: c++ matlab neural-network matlab-coder

我已经训练了一个简单的神经网络,该神经网络仅将4个数字相乘并给出1个数字作为输出。

  ( output(x0) = in1(x0)*in2(x0)*in3(x0) *in4(x0)). 

或 说明:
description

我的神经网络有4个输入和1个输出,[10 10]是隐藏层。我使用'genFunction'生成了网络之外的.m文件,然后使用MATLAB编码器生成了C ++函数。我使用以下输入类型生成代码: 输入类型:
input types

我的问题是,当我测试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;
} 

如何解决我的问题?

1 个答案:

答案 0 :(得分:0)

默认情况下,MATLAB Coder会生成按列主顺序存储矩阵和ND数组的代码。 C和C ++中的典型布局是行主要顺序。为了确保正确的行为,在调用生成的代码之前,必须先将数据从行专业转换为列专业,然后再返回至行专业以使用输出。

从MATLAB R2018a开始,MATLAB Coder提供了生成行主代码的选项。如果您的代码已经按行主顺序存储数据,则启用此设置将使您无需转换大多数数据。 release notes对此进行了描述,documentation的一部分描述了MATLAB Coder中的这些选项。