将MATLAB生成神经网络代码使用Visual Studio构建-笔记
第一步:生成代码
下面是生成的代码,其中examples中为main.c和main.h,将其复制出来,将所有.c和.h文件放在同一目录中(不放也可以,构建项目时注意子文件即可)
第二步:编写CMakeLists.txt
编写CMakeLists.txt文件,创建build目录,用于存放工程(当有多级目录,请自主添加子CMakeLists.txt)
下面展示一些 内联代码片
。
参考例子:这里的C文件一定要与生成的文件一致
cmake_minimum_required(VERSION 3.26.3)
project(demo)
include_directories(${PROJECT_SOURCE_DIR})
add_executable(demo main.c classify_fun.c classify_fun_data.c classify_fun_initialize.c classify_fun_terminate.c conv2dDirectOptimizedColMajor.c poolingOperation.c predict.c rt_nonfinite.c rtGetInf.c rtGetNaN.c)
第三步:配置生成Visual Studio工程
使用GUI配置,打开CMAKE程序
分别选择工程目录和build项目构建目录(注意,在第一步中,我已经将所有.c文件和.h文件当放到了同一个工程目录中)
点击Configure配置选择对应版本的Visual Studio,这里是2019
然后点击Generate生成工程,生成的工程就在工程目录的build文件夹下
第四步:配置使用Visual Studio工程
打开生成的工程的main.c文件,其中有一个函数:
数组dv就是需要传入的特征值,自定义即可
void main_classify_fun(void)用于分类(函数名和MATLAB的函数有关)
{
double dv[6];//特征值,需要归一化后的值,自定义即可,我这里特征值有6个
double label0;
//此函数好像没用,里面将数组清空了,注释掉即可
//argInit_6x1_real_T(dv);
label0 = classify_fun(dv);//分类得到标签值,即真正分类
printf("label = %f\r\n", label0);
}
归一化函数(float类型)
// 归一化函数,在上面函数传入数组前调用
void normalize(double arr[], int size)
{
double min_val = arr[0];
double max_val = arr[0];
// 找到数组中的最小值和最大值
for (int i = 1; i < size; i++) {
if (arr[i] < min_val) {
min_val = arr[i];
}
if (arr[i] > max_val) {
max_val = arr[i];
}
}
// 对数组进行归一化
double range = max_val - min_val;
if (range != 0.0) {
for (int i = 0; i < size; i++) {
arr[i] = (arr[i] - min_val) / range;
}
}
}
因此完整的使用流程应该为:
//该数据为原始数据,需使用函数归一化
double mydv1[6] = {-0.304063600000000,10.1322600000000,-4.65672200000000,
-16.5648900000000, 23.9236600000000, 6.24427500000000
};
void main_classify_fun(void)
{
//先对数据归一化
normalize(mydv1, 6);
double dv[6];
double label0;
//argInit_6x1_real_T(dv);
//传入函数即可
label0 = classify_fun(mydv1);
//打印分类标签
printf("label = %f\r\n", label0);
}
点击运行即可,可能会保存,找不到启动项,此时右键工程设为启动项即可。
运行示意图,我这里将归一化数据打印出来了,可以看到与matlab中的特征值对应的标签为4。(这个有一定误判,准确率与数据集和模型有关,这个不太懂)