四联光电智能照明论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2546|回复: 0
打印 上一主题 下一主题

Linux下C和matlab混合编程学习(1)

[复制链接]
  • TA的每日心情
    开心
    2018-12-28 16:25
  • 817

    主题

    1556

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    14941
    跳转到指定楼层
    楼主
    发表于 2016-10-19 10:03:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    1.编译m文件为可执行文件
    mex -setup设置好了c编译器之后。
    写个简单函数test.m
    1. function test
    2. x=0:0.01:2*pi;
    3. y=sin(x);
    4. plot(x,y)
    复制代码

    保存.
    编译mcc -m test.m
    就会生成可执行的文件test和一个脚本run_test.h
    ./run_test.h <matlab_root>/bin

    2.C中调用matlab计算引擎(绘图等)
    步骤:
    (1)安装csh;
    (2)设置:动态库路径LD_LIBRARY_PATH中添加<matlab_root>/bin/<Arch>;
             PATH路径中添加<matlab_root>/bin
    (3)编译:gcc test.c -o test -I $HOME/MATLAB/R2011b/extern/include -L $HOME/MATLAB/R2011b/bin/glnx86/ -leng -lmx -lmex
    (注意cpu是x86还是a64)
    (4)运行:./test
    (参考:http://hi.baidu.com/36470902/blo ... 3c175c08230250.html

    其中第(2)步设置,在~/.bashrc中添加:
    1. MATLAB="Matlab_Installed_Directory" (比如说我的安在了$HOME/MATLAB/R2011b下面,所以应该写全到2011b)
    2. export PATH=~/Program:$MATLAB/bin:$PATH
    3. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnx86 #这里注意cpu是x86还是a64
    4. export C_INCLUDE_PATH=$C_INCLUDE_PAT:$MATLAB/extern/include
    5. export LIBRARY_PATH=$LIBRARY_PATH:$MATLAB/bin/glnx86
    复制代码

    (前面两行是一个是可执行文件搜索路径,一个是动态库搜索路径,后面两个是gcc编译时的include头文件搜索路径和动态库搜索路径)
    这样第三步编译就可以简单的写为:
    gcc test.c -o test -leng -lmx -lmex


    源文件test.c如下:

    1. #include <math.h>
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. #include <string.h>
    5. #include "engine.h"

    6. #define N 500

    7. main()
    8. {
    9. int i;
    10. double x[N],y[N];
    11. Engine *ep;

    12. for(i=0;i<N;i++){
    13. x<i>=0.01*i;
    14. y<i>=sin(x<i>);
    15. }

    16. //启动matlab计算引擎,异常处理
    17. if(!(ep=engOpen(NULL))){
    18. printf("Can't start Matlab engine!");
    19. exit(1);
    20. }

    21. //定义mxArray
    22. mxArray *xx=mxCreateDoubleMatrix(1,N,mxREAL);
    23. mxArray *yy=mxCreateDoubleMatrix(1,N,mxREAL);

    24. //将数组复制到mxArray
    25. memcpy(mxGetPr(xx),x,N*sizeof(double));
    26. memcpy(mxGetPr(yy),y,N*sizeof(double));

    27. //将mxArray数组写入到Matlab工作空间,并命名
    28. engPutVariable(ep,"xx",xx);
    29. engPutVariable(ep,"yy",yy);

    30. //向Matlab引擎发送画图命令
    31. engEvalString(ep,"plot(xx,yy);");

    32. printf("Press 'Enter' to exit!");
    33. getchar();

    34. //销毁mxArray数组
    35. mxDestroyArray(xx);
    36. mxDestroyArray(yy);

    37. //关闭matlab引擎
    38. engClose(ep);

    39. }</i></i></i>
    复制代码

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|Silian Lighting+ ( 蜀ICP备14004521号-1 )

    GMT+8, 2024-5-16 01:59 , Processed in 1.078125 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表