我是靠谱客的博主 饱满火车,最近开发中收集的这篇文章主要介绍利用coder将matlab中的程序转换成C/C++,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

利用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++所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部