zoukankan      html  css  js  c++  java
  • matlab 与c++的混编

     环境: V7 32位
    matlab: R2011b
      visual studio 2010
     
    目标:将matlab的文件生成c可以调用的文件。至于为什么要这么做呢?我的情况是 我目前有很多函数是用matlab编的,而我的C++工程又需要这些函数,要是重新用C++来写的话工程量太大,并且有些函数是MATLAB库函数中的,所以一个简单化的想法是将M文件生成C可以调用的文件。
     
    步骤:
       1、matlab命令窗口中 输入 mbuild -setup    安装编译器
     Welcome to mbuild -setup. This utility will help you set up
    a default compiler. For a list of supported compilers, see
    http://www.mathworks.com/support/compilers/R2011b/win32.html
     
    Please choose your compiler for building standalone MATLAB applications:
     
    Would you like mbuild to locate installed compilers [y]/n? y
     
    Select a compiler:
    [1] Lcc-win32 C 2.4.1 in D:PROGRA~1MATLABR2011bsyslcc
    [2] Microsoft Visual C++ 2010 in d:Program FilesMicrosoft Visual Studio 10.0
     
    [0] None
     
    Compiler: 2
     
    Please verify your choices:
     
    Compiler: Microsoft Visual C++ 2010
    Location: d:Program FilesMicrosoft Visual Studio 10.0
     
    Are these correct [y]/n? y
     
    我是选的2,如果这里没有显示你的visual studio  那么你还要设置路径,自己再去查下怎么设置
    确定y后,就安装完成了
     
    2、mcc -W cpplib:lib**** -T link:lib****.m   ***处为你的m文件名字。
    然后就会生成一系列文件,我们有用的是
       .dll    .h    .lib   这三个文件。这这三个文件放到你的工程下面
     
     
    3.工程设置
    3.1附加包含目录加入你的matlab安装路径下的extern include     比如:D:Program FilesMATLABR2011bexterninclude
     
    3.2  链接器附加库目录 加入  lib   D:Program FilesMATLABR2011bexternlibwin32microsoft
     
     
     
    3.3    附加依赖项。要把刚生成的.lib 加入,还有其他的如下面圈出来的几个库也需要
     
     
     
    然后就可以调试了,我在网上拷了个简单的程序
    #include <iostream>
    //#include "mclmcr.h"      //这里不注释掉,则找不到mclInitializeApplication,原因是mclmcrrt.h这个头文件才是更新的头文件。
    #include "mclmcrrt.h"
    #include "matrix.h"
    #include "mclcppclass.h"
    #include "libmysvd.h"
     
    using namespace std;
     
    int main()
    {
     
     if( ! mclInitializeApplication(NULL,0) )
     {
      fprintf(stderr, "Could not initialize the application.n");
      exit(0);
     }
     
      if(!libmysvdInitialize()) //初始化,在libmysvd.h中
      {
       cout << "Could not initialize libmysvd!" <<endl;
       exit(0);
      }
     
     double data[9]={1,2,3,4,5,6,7,8,9};
     mwArray a(3,3,mxDOUBLE_CLASS,mxREAL);
     
     a.SetData(data,9);
     cout<<a<<endl<<endl; //显然,mwArry类对<<是有运算符重载的
     
     mwArray s(3,3,mxDOUBLE_CLASS,mxREAL);
     mwArray v(3,3,mxDOUBLE_CLASS,mxREAL);
     mwArray d(3,3,mxDOUBLE_CLASS,mxREAL);
     
     //mysvd(3,s,v,d,a); //调用自己用matlab写的函数,对a做奇异值分解
     
     cout<<s<<endl<<endl;
     cout<<v<<endl<<endl;
     
     for (int i=1;i<4;i++) //逐个显示元素
     {
      for (int j=1;j<4;j++)
      {
       cout<<d.Get(i,j)<<" ";
      }
      cout<<endl;
     }
     
     cin.get();
     return 0;
    }
     
     
    但是运行的时候会出现错误,
     
    应该是程序方面的问题,再进行调试
     
     
     
  • 相关阅读:
    docker 如何启动空容器
    dotnet5.0 aspnetcore runtime docker镜像
    abp asp.net core 手动获取容器中的服务
    我把代码写在别人的分支了?别慌,有办法解决
    var重复声明为什么后续声明会被忽略
    flex布局不常用到的属性整理
    微信openID和unionID的区别
    js稀疏数组、密集数组、数组空位、手写数组map方法
    vscode格式化代码换行?试试这个配置
    封装一个公共组件并上传到npm仓库
  • 原文地址:https://www.cnblogs.com/yazifei/p/3722973.html
Copyright © 2011-2022 走看看