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