VC调用matlab dll方式混合编程(c风格--例2)<二>

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 -B csharedlib:ellipsefit ellipsefit.m (此方式为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文件加入到工程中。

2.3 VC 编程:(代码如下 )

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

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

/********************************
VC调用mcc产生的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)
{
    mxArray *mxa_x, *mxa_y;
    mxArray *mxa_Xc = NULL,*mxa_Yc = NULL,*mxa_A = NULL,*mxa_B = NULL,*mxa_Phi = NULL,*mxa_P = NULL;

    mxa_x = mxCreateDoubleMatrix(x.size(),1 , mxREAL);
    mxa_y = mxCreateDoubleMatrix(y.size(),1 , mxREAL);

    memcpy(mxGetPr(mxa_x),&x[0], y.size()*sizeof(double));
    memcpy(mxGetPr(mxa_y),&y[0], y.size()*sizeof(double));//OK
    //memcpy(mxGetPr(mxa_x),&x.at(0), y.size()*sizeof(double));
    //memcpy(mxGetPr(mxa_y),&y.at(0), y.size()*sizeof(double));//OK
    //memcpy(mxGetPr(mxa_x),(void*)&(*x.begin()), y.size()*sizeof(double));
    //memcpy(mxGetPr(mxa_y),(void*)&(*y.begin()), y.size()*sizeof(double));//OK

    //copy(x.begin(),x.end(),mxGetPr(mxa_x));
    //copy(y.begin(),y.end(),mxGetPr(mxa_y));//OK
    //mxSetPr(mxa_x,&x[0]);
    //mxSetPr(mxa_y,&y[0]);//OK,但是不能释放内存空间

    mlfEllipsefit(6, &mxa_Xc,&mxa_Yc,&mxa_A,&mxa_B,&mxa_Phi,&mxa_P, mxa_x, mxa_y);

    mxDestroyArray(mxa_x);
    mxDestroyArray(mxa_y);

    double *p_Xc = mxGetPr(mxa_Xc);// 将 matlab 中的矩阵的指针传递给 C 语言中的指向 double 的指针
    Xc=p_Xc[0];

    double *p_Yc =mxGetPr(mxa_Yc);
    Yc = p_Yc[0];

    double *p_A =mxGetPr(mxa_A);
    A = p_A[0];

    double *p_B =mxGetPr(mxa_B);
    B = p_B[0];

    double *p_Phi =mxGetPr(mxa_Phi);
    Phi = p_Phi[0];

    double *p_P =mxGetPr(mxa_P);
    P = p_P[0];

    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 << "开始运行" << 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;
}

运行结果:x64下

时间: 2024-08-25 22:39:46

VC调用matlab dll方式混合编程(c风格--例2)<二>的相关文章

[转] Matlab与C++混合编程,添加OpenCV库

原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难以容忍的算法交给C++实现,C++在实现代码的过程中某些数值计算及图像处理算法 调opencv库函数. 在网上有很多matlab编写mex函数调用opencv库的方法,但都不能直接拿来.经过一步步试验,修改,最终完成,现将过程及内容记录下来留给后来人参考. 第一步: (参考参考

Matlab与C++混合编程,添加OpenCV库

最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍受.软件立刻移植到C++上又不太实际,故采用联合编程的方式,速度难以容忍的算法交给C++实现,C++在实现代码的过程中某些数值计算及图像处理算法调opencv库函数. 在网上有很多matlab编写mex函数调用opencv库的方法,但都不能直接拿来.经过一步步试验,修改,最终完成,现将过程及内容记录下来留给后来人参考. 第一步: (参考参考资料1,但其写的不够详细

[转] Matlab与C++混合编程(依赖OpenCV)

作者 [email protected],原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的Mex工具将C++的代码编译成 Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C++编写的.实现了交流无国界, 没有江山一统的谁,只有四海之内皆兄弟的豪气.另一方面,取C++所长补己之短.Matlab擅长矩阵运算,但对循环操作的效

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中算法代码编译

Matlab与.NET混合编程解决人脸识别问题

原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 http://www.cnblogs.com/asxinyu/archive/2013/04/14/3020813.html [原创]Matlab与.NET基于类型安全的接口编程入门 http://www.cnblogs.com/asxinyu/archive/2013/05/16/3082299.ht

【目录】Matlab和C#混合编程文章目录

本博客所有文章分类的总目录链接:http://www.cnblogs.com/asxinyu/p/4288836.html 1.Matlab和C#混合编程文章目录 1.国内第一部C#.Net调用Matlab进行混合编程的视频教程[彻底免费无注册码] 2.国内第一部Matlab和C#.Net混合编程入门级视频教程[完全免费]  3.[原创]Matlab与.NET混编解决人脸识别问题  4.[原创]Matlab与.NET基于类型安全的接口编程入门   5.[原创]Matlab.NET混编调用Figu

matlab 2012 vs2010混合编程

电脑配置: 操作系统:window 8.1 Matlab 2012a安装路径:D:\Program Files\MATLAB\R2012a VS2010 : OpenCV 2.4.3:D:\Program Files\opencv 补充说明: 在配置前,先检查一下系统变量: 1.若缺少系统变量(该路径必须添加!!!): D:\Program Files\MATLAB\R2012a\runtime\win64 导致结果:程序无法正常启动0x000007b.请单击“确定”关闭应用程序 注意变量配置后

Windows 64 + Matlab 64 MEX混合编程初步

说明 Matlab混合编程 下载与安装编译器 Microsoft Windows SDK 71CC TDM-GCCgccg 选择编译器 编写ccpp文件 mexFunction函数介绍 编译多个ccpp文件 ProblemSolution 找不到编译器或SDK Problem Solution 注意 error C2143 syntax error Problem Solution 说明 Matlab版本:Matlab R2014a 64-bit 操作系统版本:Windows 8.1 64-bi

以神经网络使用为例的Matlab和Android混合编程

http://www.cnblogs.com/bellkosmos/p/5598439.html 由于需要在一个Android项目中使用神经网络,而经过测试发现几个Github上开源项目的训练效果就是不如Matlab的工具箱好,所以就想在Android上使用Matlab神经网络代码(可是...) 这个问题大概处理了两天,原本预计5个小时的... 过程遇到了诸多一手坑以及看到相关资料的对新手不友好,所以就把过程记录下来希望能给后来者一些帮助 这个教程从0开始讲如何在Android App中使用Ma