VC与Matlab混合编程之调用动态链接库dll(C++)——<二>

VC与Matlab混合编程之调用动态链接库dll——<二>

1、是先建立 matlab 的 m 文件。

ellipsefit.m

其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y)

2.MCC命令编译生成得到h、dll、lib等文件

在matlab命令行中输入:

mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数)

(具体命令含义可参考《精通matlab与C/C++混合程序设计》刘维,第3版,北京航空航天大学出版社。)

(ellipsefit是生成的lib文件名,可以随意命名。ellipsefit.m是想调用的.m文件名。

至此,可以发现在ellipsefit.m所在的目录生成了一系列文件。我们将要使用:ellipsefit.h, ellipsefit.dll, ellipsefit.lib

2.3:新建一个 VC 工程:test

为了简单,我们在这里建立一个win32控制台程序。如下:

然后,将上面这3个文件(ellipsefit.h, ellipsefit.dll, ellipsefit.lib

)拷贝到VC工程所在的目录中,以便VC调用之,并将.h文件加入到工程中。

其中,ellipsefit.h中的function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y)对应的c++风格的函数接口是:

extern LIB_ellipsefit_CPP_API void MW_CALL_CONV ellipsefit(int nargout, mwArray& Xc, mwArray& Yc, mwArray& A, mwArray& B, mwArray& Phi, mwArray& P, const mwArray& x, const mwArray& y);

即在自己的主程序中调用该接口即可,c++中使用mwArray矩阵进行数据操作

2.3 VC 编程:(代码如下 )

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<vector>
#include<iostream>
#include<fstream>

/********************************
VC调ì??用??mcc产¨2生|¨2的ì?dll
************************************/
#include "mclmcrrt.h"
#include "mclmcr.h"
#include "mclcppclass.h"
#include "matrix.h"

// include lib head file
#include "ellipsefit.h"

// link matlab sys lib
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "libmx.lib")
#pragma comment(lib, "libmat.lib")
#pragma comment(lib, "mclmcr.lib")

// link lib
#pragma comment(lib, "ellipsefit.lib")
using namespace std;

bool readFile(vector<double> &vec_in, ifstream &infile)
{
    double temp;
    while(infile>>temp)
        vec_in.push_back(temp);
    return true;
}
bool ellipsefit_dll(double &Xc,double &Yc,double &A,double &B,double &Phi,double &P,vector<double> x,vector<double> y)
{
    mwArray mwa_x(x.size(),1 , mxDOUBLE_CLASS), mwa_y(y.size(),1 , mxDOUBLE_CLASS);
    mwa_x.SetData(&x[0],x.size());
    mwa_y.SetData(&y[0],y.size());

    mwArray mwa_Xc(1,1,mxDOUBLE_CLASS),mwa_Yc(1,1,mxDOUBLE_CLASS),mwa_A(1,1,mxDOUBLE_CLASS),mwa_B(1,1,mxDOUBLE_CLASS),
            mwa_Phi(1,1,mxDOUBLE_CLASS),mwa_P(1,1,mxDOUBLE_CLASS);

    ellipsefit(6,mwa_Xc,mwa_Yc,mwa_A,mwa_B,mwa_Phi,mwa_P,mwa_x, mwa_y);

    Xc=mwa_Xc(1,1);
    Yc=mwa_Yc(1,1);
    A=mwa_A(1,1);
    B=mwa_B(1,1);
    Phi=mwa_Phi(1,1);
    P=mwa_P(1,1);

    return true;
}
int main(int argc, _TCHAR* argv[])
{
    if (!mclInitializeApplication(NULL, 0))
    {
        cout << "Could not initialize the application."<< endl;;
    }
    if (!ellipsefitInitialize())
    {
        cout << "Can‘t Initalize!" << endl;
    }
    cout << "开a始o?运?行D" << endl;
    ifstream infile_x,infile_y;
    char *infile_name_x="x.txt";
    char *infile_name_y="y.txt";
    infile_x.open(infile_name_x);
    vector<double> vec_x;
    readFile(vec_x,infile_x);
    infile_y.open(infile_name_y);
    vector<double> vec_y;
    readFile(vec_y,infile_y);
    double Xc,Yc,A,B,Phi,P;
    ellipsefit_dll(Xc,Yc,A,B,Phi,P,vec_x,vec_y);
    cout<<"Xc="<<Xc<<endl;
    cout<<"Yc="<<Yc<<endl;
    cout<<"A="<<A<<endl;
    cout<<"B="<<B<<endl;
    cout<<"Phi="<<Phi<<endl;
    cout<<"P="<<P<<endl;
    ellipsefitTerminate();
    mclTerminateApplication();
    system("pause");
    return 0;
}
时间: 2024-10-12 13:13:04

VC与Matlab混合编程之调用动态链接库dll(C++)——<二>的相关文章

VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)

这是师兄们在实际项目中用到的关于VC++和MATLAB混合编程的实例.最近自己在瞎鼓捣,也就研究了下这块,本想写篇博文,但网上这块的资料还算是比较多,写的也比较具体,想着不重复劳动,因此我也就不写了. //提取节点信息 mxArray *csd_path; mxArray *save_path; mxArray *mat_path=mxCreateCellMatrix(NULL,NULL);//mxCreateCellMatrix:创建二维单位矩阵 mxArray *analog=mxCreat

VS2013调用MATLAB混合编程

Visual Studio和MATLAB混合编程,有两种方法: 1 MATLAB调用C程序: 2 VS调用MATLAB(目前见到的都是VS,其他编译器如codeblocks,或不提供这项功能): 前一种是用MATLAB的mex命令调用VS或其他编译器,将以一定方式编写出的C文件编译成.mexw32(针对win32)或者.mexw64(针对win64),然后MATLAB就可以用调用动态链接库的方式,调用C程序.这一过程中,只需要在安装好编译器的前提下,执行: mex -setup 和 mbuild

C#与MATLAB混合编程--DLL动态调用

一.MATLAB生成C#可调用的DLL MATLAB生成C#可调用的DLL可以使用MATLAB提供的deploytool工具.在命令行中敲入deploytool就可以打开这个工具.MATLAB编译器可能会需要提前配置. 打开工具对话框后填写项目名称.路径,并在type选项中选择.NET Assembly,这个选项能够生成用于C#的DLL. 完成后再左侧的.NET Assembly选项卡中点击编辑Class名称,然后在其下添加响应的m文件,如果m文件引用了其它的m文件,可以将所有关联的文件一起加入

C++和MATLAB混合编程-DLL

先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存.并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库. 动态链接库的调用有显式和隐式两种方式. 隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件. 首先将plotdata.c,plo

c#与matlab混合编程探索

以下讲述如何使用c#来调用matlab函数实现北斗定位算法的仿真 1.准备 首先需要matlab2010,vs2010(其他版本是否可行,未知),另外需要安装matlab的辅助工具MCRInstaller(该工具无需下载,在安装好的matlab程序包中可以找到,例如:E:\matlab 2010\toolbox\compiler\deploy\win32) 2.准备matlab程序 上述截图是我的定位程序所涉及到的函数 3.matlab程序处理为dll文件,供c#调用,处理的基本步骤如下: (1

java/matlab混合编程应用移植到其他电脑上遇到的问题

问题1:jar包部署在其他电脑上设置vm参数无效 @echo off start java -Xmx1028M -Xms1028M -XX:PermSize=100M -XX:MaxPermSize=100M -XX:SurvivorRatio=8 -jar Edition_1.0_fat.jar 要把参数设置在前面才有效,开始把jar包放前面虽然自己电脑能运行但是其他人的电脑不能运行 问题2:# An unexpected error has been detected by HotSpot

C/C++与Matlab混合编程初探

欢迎转载,尊重原创,所以转载请注明出处. http://blog.csdn.net/bendanban/article/details/37830495 Matlab 拥有丰富的功能,编程简单.不过,有些情况下,Matlab程序的执行速度比较慢.C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些.因此存在一种方案,就是使用Matlab实现我们的实验程序,用C/C++来实现Matlab程序中比较耗时的部分,从Matlab程序中调用C/C++的程序以实现加速. 本文主要讲解如何在M

关于C++与Matlab混合编程错误??? Unexpected Standard exception from MEX file.

 最近在用c++和matlab 混合编程是遇到了一些问题,如下: ??? Unexpected Standard exception from MEX file. What() is:c:program Error in ==> mscale at 32 [rho,s] = matscale(abs(a),0.01); Error in ==> utScaledExpm at 7 [s,junk,a] = mscale(a,'noperm','safebal'); Error in ==&

Swift和Objective-C混合编程——OC调用Swift

既然讲的是Swift和OC的混合编程,我的上一篇博客<Swift和Objective-C混合编程--Swift调用OC>讲的是如何在一个Swift项目中调用OC代码,现在我们要实现在OC项目中调用Swift代码,也是非常的方便.具体实现步骤如下: (1)创建一个iOS项目,语言选择OC,设备选择iPhone. (2)然后在项目中右键,New Files,选择Cocoa Touch Class,然后语言选择Swift.继承自NSObject.新建,会有一个对话框,选择Yes即可. . (3)此时