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

运行结果如图

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中,有多种插值函数可用于处理数据的插值操作。以下是一个简单的插值函数使用例程,演示如何使用MATLAB的`interp1`函数进行一维数据的插值操作: ```matlab % 创建示例数据 x = 0:0.5:5; % 原始数据点的横坐标 y = sin(x); % 原始数据点的纵坐标 % 创建插值点 xi = 0:0.1:5; % 想要在这些点上进行插值 % 使用 interp1 函数进行线性插值 yi_linear = interp1(x, y, xi, 'linear'); % 使用 interp1 函数进行样条插值 yi_spline = interp1(x, y, xi, 'spline'); % 绘制原始数据和插值结果 plot(x, y, 'o', xi, yi_linear, '-', xi, yi_spline, '--'); legend('原始数据', '线性插值', '样条插值'); ``` 在上述代码中,首先创建了一组示例数据,包括原始数据点的横坐标`x`和纵坐标`y`。然后,创建了一组插值点`xi`,这些点是我们希望在其上进行插值操作的位置。 接下来,使用`interp1`函数进行线性插值操作,将原始数据点`(x, y)`作为输入,指定插值点`xi`和插值方法为`'linear'`。同样,也可以使用`'spline'`作为插值方法进行样条插值操作。将插值结果保存在`yi_linear`和`yi_spline`中。 最后,使用`plot`函数将原始数据和插值结果绘制出来,并使用`legend`函数添加图例。 请注意,`interp1`函数还提供其他插值方法,如Nearest、Pchip等,可以根据实际需要选择合适的插值方法。 希望这个例程能够帮助你理解如何在MATLAB中使用插值函数进行数据插值操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值