主要参考这篇博客
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,是在: