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,是在:


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