zoukankan      html  css  js  c++  java
  • C++调用matlab实例

    这段代码是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] = '';

        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函数没定义,发现是调用语句写错了.

  • 相关阅读:
    20145318 《信息安全系统设计基础》第6.5周学习总结
    20145318 《信息安全系统设计基础》第6周学习总结
    20145318 《信息安全系统设计基础》第5.5周学习总结
    20145318 《信息安全系统设计基础》第5周学习总结
    20145318 《信息安全系统设计基础》第3周学习总结
    20145318 《信息安全系统设计基础》第2周学习总结
    20145318 《信息安全系统设计基础》第1周学习总结
    20145318 《信息安全系统设计基础》第0周学习总结
    20145318赵一Java课程总结
    20145317《信息安全系统设计基础》第10周学习总结2
  • 原文地址:https://www.cnblogs.com/scut-linmaojiang/p/4435524.html
Copyright © 2011-2022 走看看