Matlab Engine 测试用三例程 实测完成matlab调用

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");
}

运行结果如图

发布了31 篇原创文章 · 获赞 2 · 访问量 712

猜你喜欢

转载自blog.csdn.net/qq446293528/article/details/100035746