zoukankan      html  css  js  c++  java
  • matlab与vs混合编程/matlab移植

    前言

      项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程。

    在matlab中将.m文件编译生成库文件等供外部的vs程序调用,实现混合编程。

    实现步骤

    1.matlab中算法代码编译生成库文件、头文件等;

    2.创建并配置VS工程;

    3.安装配置MCR方便软件移植;

    实现环境

    matlab版本:matlab2015a

    vs版本:vs2013

    PC系统:win7_x64

    实现过程

    1.matlab中算法代码编译生成库文件、头文件等;

    1)在matlab写一个测试代码(一般是系统算法对应matlab函数);

    function [sum, prod] = sum_prod(p1, p2)
    sum = p1+p2;
    prod = p1.*p2;
    end
    

    2)生成库文件、头文件等;

    方法有两种,一种是使用matlab命令行,一种是使用matlab菜单栏工具。本文使用的是第二种方法。

    方法一:

    (1)在命令行输入命令!mcc查看是否带有mcc编译器;

    (2)命令窗口输入mbuild -setup选择要使用的c++编译器,本文选择的是mex -setup C++ -client MBUILD 编译器;

     

    (3)命令窗口输入deploytool命令,剩余步骤参考方法二;

    方法二:

    (1)matlab命令行输入deploytool即可;

    (2)输入deploytool命令之后出现以下对话框,选择Library Compiler选项;

    (3)按照下图指示步骤生成文件;

     

    (4)生成的文件夹如下图,所需要的库文件、头文件在for_redistribution_files_only文件夹中;

     

    (5)将相关库文件、头文件复制到VS工程目录下;

    2.创建并配置VS工程;

    1)创建VS工程,新建源文件作为测试;

    #include <iostream>
    #include "sum_prod.h"
    #include "mclmcrrt.h"
    #include "mclcppclass.h"
    
    #pragma comment(lib,"mclmcrrt.lib")
    #pragma comment(lib,"sum_prod.lib")
    
    using namespace std;
    
    int main()
    {
        if (!sum_prodInitialize())  //必须写
        {
            //cout << "初始化失败!" << endl;
            return -1;
        }
        double p[2][2] = { 1, 2, 3, 4 };
        mwArray X(2, 2, mxDOUBLE_CLASS);
        mwArray Y(2, 2, mxDOUBLE_CLASS);
        mwArray SUM(2, 2, mxDOUBLE_CLASS);
        mwArray PROD(2, 2, mxDOUBLE_CLASS);
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                X(i + 1, j + 1) = p[i][j];
                Y(i + 1, j + 1) = p[i][j];
            }
        }
        sum_prod(2, SUM, PROD, X, Y);
    
        double  sum[2][2], prod[2][2];
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                sum[i][j] = SUM(i + 1, j + 1);
                prod[i][j] = PROD(i + 1, j + 1);
            }
        }
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                cout << sum[i][j];
            }
            cout << endl;
        }
        cout << endl;
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                cout << prod[i][j];
            }
            cout << endl;
        }
        cout << endl;
        system("pause");
        return 0;
    }

    2)配置VS工程;

    (1)配置matlab的属性(博客中使用的是matlab2015a版本);

    项目属性VC++目录选型中添加包含目录和库目录;

    包含目录:C:Program FilesMATLABMATLAB Production ServerR2015aexterninclude;

    库目录:C:Program FilesMATLABMATLAB Production ServerR2015aexternlibwin64microsoft;

    (2)链接器输入选项添加附加依赖项;

    mclmcrrt.lib;

    sum_prod.lib

    另一种方法是直接在源文件中添加语句;

    #pragma comment(lib,"mclmcrrt.lib")
    #pragma comment(lib,"sum_prod.lib")

    注意:

    不同的源文件对应的lib可能会有不同;

    一般如果缺少lib的话会出现如下图所示的报错信息;

    (3)另,直接将打印信息输出到控制台,将会占用内存,可以使用下图所示的方法将打印信息保存在txt文件中;

    打开cmd,定位到可执行文件所在目录,按照下图操作即可得到日志文件log.txt;

    3.安装配置MCR方便软件移植;

    要想在没有安装matlab的电脑上运行matlab程序,不想安装matlab,需要安装MCR编译器;

    1)MCR安装程序;

    (1)官网math上下载;

    (2)在matlab安装目录下复制;

    文件目录:(我的是C:Program FilesMATLABMATLAB Production ServerR2015a oolboxcompilerdeploywin64)

    .R2015a oolboxcompilerdeploywin64;

    2)安装MCR编译器;

    (1)点击安装MCRInstaller.exe;

    (2)创建安装目录;

    (3)开始安装,接受许可条款;

    (4)选择安装路径,等待安装完成即可;

      本文使用的是默认安装;

    3)配置环境变量;

    安装完成之后需要将MCR编译器安装目录添加到系统环境变量中;

    (1)我的电脑>属性>高级系统设置;

    (2)在系统属性高级中点击环境变量;

     

    (3)系统变量中新建环境变量;

    (4)编辑添加系统变量;

    变量值就是MCR安装目录(本文默认目录C:Program FilesMATLABMATLAB Runtimev85 untimewin64);

    参考

    1.混合编程:http://blog.csdn.net/wind_liang/article/details/51402224

    2.MCR安装:https://jingyan.baidu.com/article/19020a0a057462529d2842d6.html

    3.http://blog.csdn.net/sjhuangx/article/details/49305237

    做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。

  • 相关阅读:
    WP7编译问题:The application could not be launched for debugging
    cocos2dxnaTweeJump学习笔记1(都是自己看别人代码后所感所想,希望有懂的人指出我的错误或者大家交流交流)
    判断datatalbe是否为空
    SOAP协议基础(转自Ksxs's )
    那些年我还不懂:IList,ICollection,IEnumerable,IEnumerator,IQueryable(转)
    MyEclipse中 智能提示 JSP 页面的html 标记属性值
    MyEclipse中设置智能提示
    MyEclipse快捷键大全
    向朋友借钱:文章值得一读,让人思索良久
    生存逼着我成功
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/6895993.html
Copyright © 2011-2022 走看看