1、Matlab 执行engEvalString命令介绍
engEvalString(Engine *ep, Const char *string);
参数 ep 为函数 engOpen 返回的引擎指针,字符串 string 为要 matlab 执行的命令。
详见:https://blog.csdn.net/eagleest/article/details/7702178
2、VS下调用Matlab引擎
matlab /regserver
如果无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。
详见:https://blog.csdn.net/qq_16149777/article/details/51952503
3、测试demo
程序一:数组绘图
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<engine.h>
#define dataNum 100
int main()
{
int ret = 0;
Engine* eg = NULL;
if (!(eg = engOpen(NULL)))
{
printf("Open matlab enging fail!");
return 1;
}
double xtemp[dataNum] = { 0 };
double ytemp[dataNum] = { 0 };
for (int i = 0; i < dataNum; i++)
{
xtemp[i] = i * 2.0 * 3.1415926 / 100.0;
ytemp[i] = sin(xtemp[i]);
}
mxArray *X = mxCreateDoubleMatrix(1, dataNum, mxREAL);//创建matlab存储数据的指针
mxArray *Y = mxCreateDoubleMatrix(1, dataNum, mxREAL);
memcpy(mxGetPr(X), xtemp, dataNum * sizeof(double)); //数据复制
memcpy(mxGetPr(Y), ytemp, dataNum * sizeof(double));
if ((ret = engPutVariable(eg, "X", X)) != 0) //把数据传递到matlab工作空间,并命名为X
printf("engPutVariable error:%d\n", ret);
if ((ret = engPutVariable(eg, "Y", Y)) != 0)
printf("engPutVariable error:%d\n", ret);
engEvalString(eg, "plot(X,Y)");//运行绘图命令
getchar();
if(eg)
engClose(eg);
return 0;
}
原文链接:https://blog.csdn.net/libing403/article/details/79135220
程序二:绘制正弦曲线
// CMatlab.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h" // add header file
// import necessary lib
#pragma comment( lib, "libeng.lib")
#pragma comment( lib, "libmx.lib")
#pragma comment( lib, "libmat.lib")
int main(void)
{
Engine *ep;
// open engine
if (!(ep = engOpen("\0")))
{
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
// generate variables
int Nsample = 50;
const double PI = 3.1415926;
double *t = new double[Nsample] ;
for(int i = 0; i < Nsample; i++)
{
t[i] = i * 2 * PI / Nsample;
}
mxArray *T = NULL, *result = NULL;
T = mxCreateDoubleMatrix(1, Nsample, mxREAL);
memcpy((void *)mxGetPr(T), (void *)t, Nsample*sizeof(t[0]));
engPutVariable(ep, "T", T); // put data to engine
// execute matlab operations
engEvalString(ep, "Y=sin(T);");
engEvalString(ep, "plot(T,Y);");
engEvalString(ep, "title('y=sin(t)');");
engEvalString(ep, "xlabel('t');");
engEvalString(ep, "ylabel('y');");
printf("Hit return to continue\n");
fgetc(stdin);
// clean operation(don't forget!!!)
mxDestroyArray(T);
engEvalString(ep, "close;");
// close engine
engClose(ep);
return EXIT_SUCCESS;
}
原文链接:https://blog.csdn.net/guyuealian/article/details/73743654
程序三:c++与matlab混合编译———读取mxArray内容
//#include "pch.h"
#include <iostream>
#include "engine.h"
#include <string.h>
using namespace std;
int main()
{
//开启引擎
Engine *ep = NULL; //申明引擎指针
if (!(ep = engOpen(""))) { //指向matlab工作空间
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
/*--------------------------------------标量验证--------------------------------------------------*/
cout << " (1)标量验证\n" << endl;
mxArray *X, *Y, *Zaddress; //matlab变量的指针
X = mxCreateDoubleScalar(3);
Y = mxCreateDoubleScalar(4);
engPutVariable(ep, "X", X); //变量X送入引擎,别名也是‘X’
engPutVariable(ep, "Y", Y); //变量Y送入引擎,别名也是‘Y’
engEvalString(ep, "Z=X*Y"); //在matlab引擎中执行操作
Zaddress = engGetVariable(ep, "Z"); //获取matlab变量Z的地址
std::cout << "adress of Z is:" << Zaddress << std::endl;
auto value = *(mxGetPr(Zaddress)); //获取Zaddress实部指针并解引用
std::cout << "value of Z is:" << value << "\n\n" << std::endl;
mxDestroyArray(X); //类似于matlab::clear
mxDestroyArray(Y);
mxDestroyArray(Zaddress);
/*---------------------------------------2D矩阵验证--------------------------------------------------*/
// a=magic(3)=[8 1 6;
// 3 5 7;
// 4 9 2;]
cout << " (2)2D矩阵验证\n" << endl;
engEvalString(ep, "a=magic(3)"); //在matlab引擎中执行matlab命令
mxArray *A = engGetVariable(ep, "a"); //matlab变量的指针
size_t M = mxGetM(A); //M为矩阵行数 (size_t == unsigned int64)
size_t N = mxGetN(A); //N为矩阵列数
int aNOE = mxGetNumberOfElements(A); //统计矩阵元素个数
cout << "矩阵a的行列值分别是: " << M << "和" << N << endl;
cout << "矩阵a的元素个数是: " << aNOE << endl;
int i = 1;
double* p = mxGetPr(A); //实部指针
while (p != NULL && i <= aNOE) //打印各个元素
{
cout << "第" << i << "个是:" << *p++ << endl;
i++;
}
mxDestroyArray(A); //clear
/*---------------------------------------高维矩阵验证--------------------------------------------------*/
// 测试矩阵为b=rand(4,4,4,2);
//
cout << "\n (2)高维矩阵验证\n" << endl;
engEvalString(ep, "b=rand(4,4,4,2)"); //在matlab引擎中执行matlab命令
mxArray *B = engGetVariable(ep, "b"); //matlab变量的指针
mwSize bNOD = mxGetNumberOfDimensions(B); //矩阵的维数
const mwSize *D = mxGetDimensions(B); //D指向各维数指针
int bNOE = mxGetNumberOfElements(B); //统计矩阵元素个数
cout << "矩阵b的维数是:" << bNOD << endl;
int j = 1;
cout << "各维大小分别为:";
while (j <= bNOD) //打印各个维数
{
cout << *D++ << " ";
++j;
}
cout << "\n矩阵b的元素个数是: " << bNOE << endl;
mxDestroyArray(B); //clear
/* 关闭引擎*/
engClose(ep);
system ("pause");
}
运行结果如图