声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2413|回复: 4

[混合编程] 调用matlab引擎通过txt绘图

[复制链接]
发表于 2011-5-9 21:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 sunminmin 于 2011-5-10 08:47 编辑

在matlab的commond窗口中键入下面的代码能得到map.txt对应的图形:(:map.txt中每一行为一个点的坐标(x,y,z)。)

  1. M = dlmread('map.txt'); % 读取map.txt文件中的数据
  2. x = M(:,1); % 取第一列
  3. y = M(:,2); % 取第二列
  4. z = M(:,3); % 取第三列
  5. x = reshape(x,65,65); % 重构为size=65*65的方格
  6. y = reshape(y,65,65); % 重构为size=65*65的方格
  7. z = reshape(z,65,65); % 重构为size=65*65的方格
  8. surf(x,y,z) % 绘图
  9. shading flat %各小曲面之间不要网格
  10. xlabel('X(单位:千米)')
  11. ylabel('Y(单位:千米)')
  12. zlabel('Z(单位:千米)')
复制代码

但是在VC++中建立MFC AppWizard基于基本对话框的工程TxtToMap,调用matlab引擎绘不出map.txt对应的图形

VC界面.jpg     map.jpg

  1. void CTxtToMapDlg::OnButtonBrowsing()
  2. {
  3. // TODO: Add your control notification handler code here
  4. char szFilters[] = "MyType Files (*.txt)|*.txt|All Files (*.*)|*.*||";

  5. CFileDialog fileDlg (TRUE, "txt", "*.txt",OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);

  6. // Display the file dialog. When user clicks OK, fileDlg.DoModal()
  7. // returns IDOK.
  8. if( fileDlg.DoModal()==IDOK )
  9. {
  10. CString pathName = fileDlg.GetPathName();

  11. m_FilePath = pathName; //m_FilePath里保存txt文件的路径

  12. UpdateData(FALSE);
  13. }
  14. }
复制代码
  1. void CTxtToMapDlg::OnButtonTxtToMap()
  2. {
  3. // TODO: Add your control notification handler code here


  4. Engine *ep;

  5. if (!(ep = engOpen(NULL))) //打开Matlab引擎

  6. {

  7. MessageBox ("Can't start MATLAB engine", MB_OK);

  8. exit(-1);
  9. }

  10. int N = 4225;
  11. mxArray *M = mxCreateDoubleMatrix(N,3,mxREAL);
  12. mxArray *x = mxCreateDoubleMatrix(1,N,mxREAL);
  13. mxArray *y = mxCreateDoubleMatrix(1,N,mxREAL);
  14. mxArray *z = mxCreateDoubleMatrix(1,N,mxREAL);
  15. engPutVariable(ep,"M",M);
  16. engPutVariable(ep,"x",x);
  17. engPutVariable(ep,"y",y);
  18. engPutVariable(ep,"z",z);
  19. engEvalString(ep,"M = dlmread('m_FilePath')"); //m_FilePath保存map.txt的路径,读取map.txt文件中的数据
  20. engEvalString(ep,"x = M(:,1)"); //取第一列
  21. engEvalString(ep,"y = M(:,2)"); // 取第二列
  22. engEvalString(ep,"z = M(:,3)"); // 取第三列
  23. engEvalString(ep,"x = reshape(x,65,65)"); //重构为size=65*65的方格
  24. engEvalString(ep,"y = reshape(y,65,65)"); //重构为size=65*65的方格
  25. engEvalString(ep,"z = reshape(z,65,65)"); //重构为size=65*65的方格
  26. engEvalString(ep,"surf(x,y,z)"); //绘图

  27. }
复制代码

我刚开始学vc++与matlab混合编程调用matlab引擎,我自己也知道上面void CTxtToMapDlg::OnButtonTxtToMap() 中的代码写的有错,请问如何修改才能得到map.txt对应的图形?

map.rar (29.55 KB, 下载次数: 2)
回复
分享到:

使用道具 举报

 楼主| 发表于 2011-5-11 15:28 | 显示全部楼层
本帖最后由 sunminmin 于 2011-5-11 16:33 编辑

回复 1 # sunminmin 的帖子

如何调用matlab引擎把map.txt load进matlab,让matlab绘出对应的三维图?关键是这个数据量太大,怎样拟合才能通过matlab引擎把图绘出来?
上面的void CTxtToMapDlg::OnButtonTxtToMap()怎么修改,那样写错在哪里?
 楼主| 发表于 2011-5-12 13:25 | 显示全部楼层
能这样用吗?   engEvalString(ep,"M = dlmread('m_FilePath')"); //m_FilePath保存map.txt的路径,读取map.txt文件中的数据
 楼主| 发表于 2011-6-1 16:03 | 显示全部楼层
还是靠自己解决了。


  1.   Engine *ep;

  2. if (!(ep = engOpen(NULL))) //打开Matlab引擎
  3.   
  4. {              
  5.   
  6.   MessageBox ("Can't start MATLAB engine", MB_OK);
  7.   
  8.   exit(-1);
  9.   
  10. }


  11. int N = 4225; //txt文件中有4225行数据
  12. mxArray *M = mxCreateDoubleMatrix(N,3,mxREAL);
  13. mxArray *x = mxCreateDoubleMatrix(1,N,mxREAL);
  14. mxArray *y = mxCreateDoubleMatrix(1,N,mxREAL);
  15. mxArray *z = mxCreateDoubleMatrix(1,N,mxREAL);
  16. mxArray *xx = mxCreateDoubleMatrix(65,65,mxREAL);
  17. mxArray *yy = mxCreateDoubleMatrix(65,65,mxREAL);
  18. mxArray *zz = mxCreateDoubleMatrix(65,65,mxREAL);
  19. engPutVariable(ep,"M",M);
  20. engPutVariable(ep,"x",x);
  21. engPutVariable(ep,"y",y);
  22. engPutVariable(ep,"z",z);
  23. engPutVariable(ep,"xx",x);
  24. engPutVariable(ep,"yy",y);
  25. engPutVariable(ep,"zz",z);

  26. CString s1("M = load('");
  27. CString s2("')");
  28. CString s = s1+m_FilePath+s2;
  29. char * p = (LPSTR)(LPCTSTR)s;
  30. engEvalString(ep,p);
  31. engEvalString(ep,"x = M(:,1)"); //取第一列
  32. engEvalString(ep,"y = M(:,2)"); // 取第二列
  33. engEvalString(ep,"z = M(:,3)"); // 取第三列
  34. engEvalString(ep,"xx = reshape(x,65,65)"); //重构为size=65*65的方格
  35. engEvalString(ep,"yy = reshape(y,65,65)"); //重构为size=65*65的方格
  36. engEvalString(ep,"zz = reshape(z,65,65)"); //重构为size=65*65的方格
  37. engEvalString(ep,"mesh(xx,yy,zz)"); //绘图
  38. engEvalString(ep,"xlabel('X(单位:千米)')");
  39. engEvalString(ep,"ylabel('Y(单位:千米)')");
  40. engEvalString(ep,"zlabel('Z(单位:百米)')");
复制代码

点评

CString s1("M = load('"); CString s2("')"); CString s = s1+m_FilePath+s2; char * p = (LPSTR)(LPCTSTR)s; engEvalString(ep,p);  发表于 2011-6-1 16:04

评分

1

查看全部评分

 楼主| 发表于 2011-6-1 19:26 | 显示全部楼层
解决问题之后回来分享经验
在那个调用引擎画图的那个消息响应函数里有错,即engEvalString(ep,"M = load('m_FilePath')");有错。
就是调用m_filename变量的时候,传的是“M = load(m_filename.txt)"是字符串啊,没办法调出m_filename的值来
M = load('m_FilePath')"这句话再matlab里是不能够知道m_FilePath是什么的,得把几个字符串拼接起来
M = load('+ m_FilePath+ ')" 把这3段字符串拼接然后传入matlab 。


现在的问题就是
比如
m_FilePath = "C:\New folder\my.txt"
engEvalString(ep,"M = load('m_FilePath')");这句话运行后相当于在matlab里运行这句话M = load('m_FilePath'),
但是实际上应该传入这句话M = load('C:\New folder\my.txt')


用下面的语句
CString s1("M = load('");
CString s2("')");
Ctring s = s1+m_FilePath+s2;
char * p = (LPSTR)(LPCTSTR)s;
engEvalString(ep,p);
替换engEvalString(ep,"M = load('+m_FilePath+')");
这句


问题就解决了!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-11 06:33 , Processed in 0.080193 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表