概述
利用coder将matlab中的程序转换成C/C++
众所周知,matlab的功能是非常强大的,简便易于操作的工具包更是非常的方便。为机器学习,深度学习,图像处理,语音识别等提供了很大的帮助。但是,在今天万物嵌入的社会,一个独立的个体有着独立的mcu。众多单片机,嵌入式设备都支持C/C++代码,而不支持matlab代码,因此,我们若想把在matlab中编写的程序下载到单片机中,就必须转换成C/C++代码。
matlab恰好个我们提供了工具包——matlab coder。它的诞生,让我们愿望成了现实。下面我就 将matlab 中的程序转换成C做详细介绍。
matlab函数如下
这段函数的功能是计算高斯核(参数是标准差的大小)
计算高斯核是高斯模糊滤波必不可少的一步
function result = count_gaosi( d )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 计算高斯核 %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C=zeros(5,5);
D=zeros(5,5);
E=zeros(5,5);
pi=3.1415926;%高斯公式中Π的值
sum1=0;%计算累计权重的值
% d=1.5;%高斯核标准差
c=5;%高斯核大小
center=(c/2)+0.5;%模板的中心,这里取整
A=1/(2*pi*d*d);%高斯公式指数前面的系数
for i=1:c
x2=(i-center)*(i-center);
for j=1:c
y2=(j-center)*(j-center);
B=exp(-(x2+y2)/(2*d*d));
C(i,j)=A.*B;
sum1=sum1+C(i,j);
end
end
%整数形式的高斯核,需要进行归一化,即把左上角的值化为1
%下面进行归一化
k=1/C(1,1);
for i=1:c
for j=1:c
D(i,j)=C(i,j)*k;%进行归一化后整数形式的高斯核,有小数可以取整
sum1=sum1+D(i,j);
end
end
%若需要小数形式的高斯核,则在不需要归一化,而需要进权重分配,高斯核的每个系数要除以所有系数的和。
%下面进行权重分配
for i=1:c
for j=1:c
E(i,j)=C(i,j)/sum1;%进行权重分配后小数形式的高斯核
end
end
result= E;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 高斯滤波器模板的生成最重要的参数就是高斯分布的标准差。
% 标准差代表着数据的离散程度,如果较小,那么生成的模板的中心系数较大,
% 而周围的系数较小,这样对图像的平滑效果就不是很明显;
% 反之,较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
测试代码
clc
close all
d=1.5;
result=count_gaosi(d)
输出如下
具体转换
第一步
命令框输入coder,回车键
第二步
选中要转换的函数
第三步
选中测试函数,识别参数数据类型,这里如果没有测试函数,可以手动选择。
第四步
检测生成MEX文件中的问题
检测通过
第五步
选择需要生成的代码(C/C++),点击Generate,生成代码
上述代码生成的代码如下
/*
* File: count_gaosi.c
*
* MATLAB Coder version : 4.1
* C/C++ source code generated on : 15-Feb-2020 14:02:19
*/
/* Include Files */
#include <math.h>
#include "count_gaosi.h"
/* Function Definitions */
/*
* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* 计算高斯核 %%
* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
* Arguments : double d
* double result[25]
* Return Type : void
*/
void count_gaosi(double d, double result[25])
{
double sum1;
double A;
int i;
int x2;
int j;
double C[25];
double d0;
/* 高斯公式中Π的值 */
sum1 = 0.0;
/* 计算累计权重的值 */
/* d=1.5;%高斯核标准差 */
/* 高斯核大小 */
/* 模板的中心,这里取整 */
A = 1.0 / (6.2831852 * d * d);
/* 高斯公式指数前面的系数 */
for (i = 0; i < 5; i++) {
x2 = (i - 2) * (i - 2);
for (j = 0; j < 5; j++) {
d0 = A * exp(-(double)(x2 + (j - 2) * (j - 2)) / (2.0 * d * d));
C[i + 5 * j] = d0;
sum1 += d0;
}
}
/* 整数形式的高斯核,需要进行归一化,即把左上角的值化为1 */
/* 下面进行归一化 */
A = 1.0 / C[0];
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
/* 进行归一化后整数形式的高斯核,有小数可以取整 */
sum1 += C[i + 5 * j] * A;
}
}
/* 若需要小数形式的高斯核,则在不需要归一化,而需要进权重分配,高斯核的每个系数要除以所有系数的和。 */
/* 下面进行权重分配 */
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
x2 = i + 5 * j;
result[x2] = C[x2] / sum1;
/* 进行权重分配后小数形式的高斯核 */
}
}
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
/* 高斯滤波器模板的生成最重要的参数就是高斯分布的标准差。 */
/* 标准差代表着数据的离散程度,如果较小,那么生成的模板的中心系数较大, */
/* 而周围的系数较小,这样对图像的平滑效果就不是很明显; */
/* 反之,较大,则生成的模板的各个系数相差就不是很大,比较类似均值模板,对图像的平滑效果比较明显。 */
/* %%%%%%%%%%%%%%%%%%%%%%%%%%%截至这里,高斯核以计算完毕%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
}
/*
* File trailer for count_gaosi.c
*
* [EOF]
*/
到此为止,利用coder将matlab中的程序转换成C/C++已介绍完成,如有问题,或需要探讨,请留言或联系本人。
Q
Q
:
2214564003
QQ:2214564003
QQ:2214564003
欢迎关注本人微信公众号:
最后
以上就是饱满火车为你收集整理的利用coder将matlab中的程序转换成C/C++的全部内容,希望文章能够帮你解决利用coder将matlab中的程序转换成C/C++所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复