VS直接应用matlab语句混合编程+作图实例+一些错误解决办法

主要参考这篇博客

https://blog.csdn.net/liyuqian199695/article/details/58587831


我的环境:win7 64位 vs2013 matlab2017b 均为正版

使用engEvalString函数可以在vs中直接应用matlab的语句,比如画一个三维图:

#include<cstdlib>
#include <cstdio>
#include<cstring>
#include"engine.h"

const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
void test()
{
	Engine* ep;
	
	if ((ep = engOpen("")) == NULL)
	{
		printf("Engine Fail");
	}
	engOutputBuffer(ep, buffer, BUFFER_SIZE);
	printf("Init Success");

	engEvalString(ep, "t = -2:0.1 : 2");
	engEvalString(ep, "[x, y] = meshgrid(t)");
	engEvalString(ep, "z = 5*x.^2+8*y^3");
	engEvalString(ep, "surf(x, y, z)");

	getchar();
	engClose(ep);
}

int main()
{
	test();
}

但如果使用engEvalString来读取文件中的数据,比如通过importdata、fileread等函数,则会读取失败,暂不明原因。

这时可使用vs的读取文件的功能,再通过engPutVariable引入到engEvalString中。以下博客为读取txt中的二维数组:

https://blog.csdn.net/u013749068/article/details/78761553

在 VC 中,所有和 Matlab 的数据交互都是通过 mxArray 来实现的。engEvalString引擎函数中,所有与变量有关的数据类型都是 mxArray 类型。若要新建一个double 类型数组,可用函数mxCreateDoubleMatrix。

参考:https://blog.csdn.net/eagleest/article/details/7702178

读取过程如下:

	double data[48][900] = { 0 };//定义一个48*900的矩阵,用于存放数据  
	ifstream infile;//定义读取文件流,相对于程序来说是in  
	infile.open("E:\\so2_20180514154024_0.5nm_308_320_bc_16bin_matrix.txt");//打开文件  
	for (int i = 0; i < 48; i++)//定义行循环  
	{
		for (int j = 0; j < 900; j++)
					infile >> data[i][j];//读取一个值(空格、制表符、换行隔开)就写入到矩阵中,行列不断循环进行
		}	  
	}
	infile.close();//读取完成之后关闭文件  

	mxArray *data_r = NULL;
	data_r = mxCreateDoubleMatrix(48, 900, mxREAL);
	memcpy((void *)mxGetPr(data_r), (void *)data, sizeof(data));
	engPutVariable(ep, "data", data_r);

本设计令此二维数组在三维空间呈现。使用size函数读取数组行数列数,meshgrid函数用其作为参数生成x、y座标。

	engEvalString(ep, "data = reshape(data,900,48)';");
	engEvalString(ep, "s_z = size(data);");
	engEvalString(ep, "[X, Y] = meshgrid(1:s_z(2), 1 : s_z(1));");
	engEvalString(ep, "surf(X, Y, data);");

最后,使用getchar();函数可使窗口停留,观察图像。全部程序:

#include<cstdlib>
#include<cstdio>
#include<cstring>
#include"engine.h"
#include<iostream>  
#include<fstream>  
#include<typeinfo>  

using namespace std;

const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];
void test()
{
	Engine* ep;

	if ((ep = engOpen("")) == NULL)
	{
		printf("Engine Fail");
	}
	engOutputBuffer(ep, buffer, BUFFER_SIZE);
	printf("Init Success");
	/**********从vs中读取文件给matlab变量赋值*****************/
	double data[48][900] = { 0 };//定义一个48*900的矩阵,用于存放数据  
	ifstream infile;//定义读取文件流,相对于程序来说是in  
	infile.open("E:\\so2_20180514154024_0.5nm_308_320_bc_16bin_matrix.txt");//打开文件  
	for (int i = 0; i < 48; i++)//定义行循环  
	{
		for (int j = 0; j < 900; j++)
		{ 
			infile >> data[i][j];//读取一个值(空格、制表符、换行隔开)就写入到矩阵中,行列不断循环进行
		}	  
	}
	infile.close();//读取完成之后关闭文件  

	mxArray *data_r = NULL;
	data_r = mxCreateDoubleMatrix(48, 900, mxREAL);
	memcpy((void *)mxGetPr(data_r), (void *)data, sizeof(data));
	engPutVariable(ep, "data", data_r);	
	/*********************************************************/
	
	//engEvalString(ep, "Z = importdata('E:\vs_matlab\so2_20180514154024_0.5nm_308_320_bc_16bin_matrix.txt');");//vs读不了
	engEvalString(ep, "data = reshape(data,900,48)';");
	engEvalString(ep, "s_z = size(data);");
	engEvalString(ep, "[X, Y] = meshgrid(1:s_z(2), 1 : s_z(1));");
	engEvalString(ep, "surf(X, Y, data);");

	getchar();
	engClose(ep);
}
int main()
{
	test();
}

至于错误,主要是对dll、lib、h的调用。

添加.h,是在:



添加.lib,是在:



添加.dll,是在:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章