码迷,mamicode.com
首页 > 编程语言 > 详细

C++调用matlab实例

时间:2015-04-17 20:06:15      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

这段代码是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.^2, 2));

end

 

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

技术分享

 

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

技术分享

C++调用matlab实例

标签:

原文地址:http://www.cnblogs.com/scut-linmaojiang/p/4435524.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!