这段代码是C++调用matab引擎的过程,代码的目的很简单,在C++中创建一个vector数组,然后将这个vector数组单位化。写这个代码的目的是学些C++与matlab之间的数据交互,以供日后参考。

#include <iostream>

#include <cstdio>

#include <vector>

#include <math.h>

#include <time.h>

#include "engine.h"

#include<Eigen/Dense>

using namespace Eigen;

using namespace std;

vector<double> vecA;

void createA(int m );

int main()

{

const int num = 10;

createA( num );//创建原始矩阵vecA

double * pa = new double[10];

for( int i = 0; i < num; i++)

{

pa[i] = vecA[i];

}

Engine * m_engine;//matlab引擎

m_engine = NULL;//初始化matlab引擎

if((!m_engine && !(m_engine = engOpen(NULL))))// 打开amatlab引擎,失败则退出

{

return -1;

}

engSetVisible(m_engine,1);//设置matlab窗口在调用时的可见性,为a1时可见?

//把需要计算的数据传入matlab

mxArray *VecA= mxCreateDoubleMatrix(10, 1, mxREAL);//创建10行1列的实数,组数组类型是matlab特有的

memcpy((void *) mxGetPr(VecA), (void *) pa, 10 * sizeof(double));//将C++中D的数据传入matlab

engPutVariable(m_engine, "vec", VecA);//赋值语句,vec是matlab代码中的输入参数y,VecA是C++传入的参数

//buffer用来接收调试信息,当matlab代码有错时,可以输出buffer查看错误信息

char buffer[255];

buffer[254] = '\0';

engOutputBuffer(m_engine, buffer, 255);

engEvalString(m_engine, "cd('D:\\code\\TestEigen\\Testeigen\\mat_code')");//打开matlab代码所在文件夹,注意路径中是双反斜杠

engEvalString(m_engine,"normalV = normalizeVec(vec);");//这是matlab中的调用语句,注意,matlab的.m文件名要与调用的函数名一致,否则会找不到要调用的函数

printf("%s", buffer);//当matlab代码出错时,用来输出调试信息

//接下来把matlab的计算结果传回给C++

mxArray * mvec = NULL; //同样声明一个matlab中的阵阵类型

mvec = engGetVariable(m_engine, "normalV");

double * cvec= NULL;//声明一个C++中的指针

cvec= (double*)mxGetData(mvec);//将matlab中的数据赋给C++中的数据

for( int i = 0; i<num; i++)

{

cout<< cvec[i] << " ";

}

mxDestroyArray(VecA); //销毁matlab数组

mxDestroyArray(mvec);

return 0;

system("pause" );

}

void createA(int m )

{

srand(time(NULL));

for( int i = 0; i < m; i++ )

{

vecA.push_back(rand()%4 + 1);

cout << vecA[i]<<" ";

}

cout <<endl<<"-----------------------"<<endl;

}

输出结果:

Matlab代码:

%功能是实现一个向量的单位化

function normalV = normalizeVec(vec)

normalV = vec/sqrt(sum(vec.^, ));

end

出现错误时,看到提示信息如下,

然后知道是normaozeVe函数没定义,发现是调用语句写错了.

C++调用matlab实例的更多相关文章

  1. 使用Java程序调用MatLab

    Java代码实现的计算难免会显得不够高效.而利用MATLAB写好相应的计算函数,然后打包成jar包供Java调用,在某些情况下会更加方便.或者有些时候会涉及到使用Java调用MatLab展现一些二维三 ...

  2. java调用matlab绘图

    一 注意事项 1: MatLab的版本必须是2006b+(包括2006b或更高版本),因为只有在这些版本中才有MATLAB Builder for Java(也叫Java Builder). 2: 运 ...

  3. 【转】C++调用Matlab的.m文件

    原文地址     Matlab是一个强大的数学计算/仿真工 具,其内置了很多实用的现成的函数,而且我们经常也自己定义很多m函数.但在很多情况下,我们不得不使用VC编程.那么,如何在VC中利用matla ...

  4. MATLAB实例:PCA降维

    MATLAB实例:PCA降维 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. iris数据 5.1,3.5,1.4,0.2,1 4.9,3.0,1 ...

  5. MATLAB实例:PCA(主成成分分析)详解

    MATLAB实例:PCA(主成成分分析)详解 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 主成成分分析 2. MATLAB解释 详细信息请看: ...

  6. C#调用Matlab生成的Dll

    问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...

  7. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  8. WPF调用Matlab函数方法

    有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调 ...

  9. Don’t Use Accessor Methods in Initializer Methods and dealloc 【初始化和dealloc方法中不要调用属性的存取方法,而要直接调用 _实例变量】

    1.问题:    在dealloc方法中使用[self.xxx release]和[xxx release]的区别? 用Xcode的Analyze分析我的Project,会列出一堆如下的提示:Inco ...

随机推荐

  1. 李洪强iOS开发之initWithFrame,initWithCoder和aweakFormNib

    1 initWithFrame 通过代码创建控件的话用这个方法设置  2 initWithCoder(先执行) 与从xib加载有关系的 在此方法里面设置原有子控件的值是不行的,因为还没有连好线  3 ...

  2. Protege A DOT error has occurred错误

    问题参生的原因:graphviz没有安装或者,没有配置好 解决方法: 1.下载graphviz,这里是百度软件下载的,在官网下载需要注册账户,麻烦 2.安装graphviz,找到下面的路径. 3.设置 ...

  3. iOS 越狱机免证书调试

    目前在XCode上开发的iOS程序只能在模拟器Simulator中运行,如果要放到真机上测试,需要苹果官方认证的开发者账号,购买开发者证书iDP,99美金一年啊! 作为刚开始学习iOS编程的菜鸟,这么 ...

  4. HDU5090——Game with Pearls(匈牙利算法|贪心)(2014上海邀请赛重现)

    Game with Pearls Problem DescriptionTom and Jerry are playing a game with tubes and pearls. The rule ...

  5. [HIHO1318]非法二进制(动态规划)

    题目链接:http://hihocoder.com/problemset/problem/1318 题意:是个dp题.考虑二进制数为i位的时候,无非有两种情况:新添加的一位为0或者1. 为0的时候,那 ...

  6. open_table

    /* Open a table. SYNOPSIS open_table() thd Thread context. table_list Open first table in list. acti ...

  7. Spring 使用注解方式进行事务管理

    转载:http://www.cnblogs.com/younggun/archive/2013/07/16/3193800.html 使用步骤: 步骤一.在spring配置文件中引入<tx:&g ...

  8. UVa 699 The Falling Leaves

    题意:给出按先序输入的一颗二叉树,分别求出从左到右的相同横坐标上的节点的权值之和 递归建树,然后用sum数组分别统计每一个横坐标上的权值之和 感觉建树都在递归递归递归= =慢慢理解吧 #include ...

  9. websocket webworker

    对我来说最快的学习途径是实践,所以找两个东西来练手.一个是websocket一个是webwoker,今天先说第一个. 要理解socket就要先理解http和tcp的区别,简单说就是一个是短链,一个是长 ...

  10. 转载:iOS 推送的服务端实现

    参考网址1: iOS消息推送机制的实现 http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html 参考网址2: iOS 推送的 ...