登录   |   注册
    准考证打印   论文投票   报考指南   论文辅导   软考培训   郑重申明  
您现在的位置:  首页 > 通信学苑 > 中级互联网技术 >> 正文
正文
通信工程原理之基于COM的MatIab的参数处理
来源:尚大教育-通信学院 作者:辉辉 时间;2012-12-28 点击数: 尚大软考交流群:376154208
基于COM组件的Matlab与C++混合编程方式因拥有独立的运行环境和两种语言的互补优势而被众多科研人员和编程人员所接受,同时也是MathWorks公司推荐使用的混编方式。但在程序设计过程中,通常会 遇到两个难点问题:(1)二维数组参数的传递与输出; (2)Matlab生成图形嵌入VC工程界面中。对于第一个问题,Bruce McKinney[1]在MSDN上指出;“如果对一维数组进行操作,则SAFEARRAY函数变的简单且易操作。


  程序实现如下:


  (1)将原pcamat.m进行修改,添加生成图像的相关代码


  function [eigenvector,eigenvalue] = pcamat(oriData,row,column,picName)


  //增加picName参数,VC平台下hFig将通过该名称获取生成图像的句柄


  figure(‘NumberTitle','Off','MenuBar','None','ToolBar','Figure','Name',picName,'Units','Points’);


  //图像参数预设,保留工具栏。使用Matlab提供的工具栏的所有功能是使用该方法的最大优点


  percent = 100*eigenvalue /sum(eigenvalue);


  //计算贡献率


  pareto(percent);                                              //画图


  xlabel(‘主成分’);


  ylabel(‘方差占的比重(%)’);


  (2)封装打包成名为figure的COM组件,并完成注册等相关操作。因为修改后的m文件运行结果包含输出结果和图像两部分,所以下面有关图像处理的代码依然在PCATest控件的响应函数中。


  CString WNDName = “Demo”;         //自定义窗口名称


  Ifigureclass *pic;


  VARIANT oriData, row, col, picName,eigVector, eigValue;    VariantInit(&picName);


  ……


  picName.vt = VT_BSTR;         //将自定义窗口名称赋予


  Matlab生成图像


  picName.bstrVal = WNDName.AllocSysString();


  HWND hFig;  int timer = 50;


  //用死循环确保可以获取到图像句柄,注意此处必须使用sleep(),给予系统足够的响应时间


  while(1){


  pic->pcamat(2,&eigVector,&eigValue,oriData,row,col,


  picName);


  Sleep(timer);


  hFig = ::FindWindow(NULL,FigName);


  if(hFig != NULL){


  break;


  }


  timer += 10;


  pic->Release();


  }


  long lStyle = ::GetWindowLong(hFig,GWL_STYLE);  //设置Figure窗口样式。
//注意SetWindowLong()和SetWindowPos()先后顺序,详见MSDN


  ::SetWindowLong(hFig,GWL_STYLE,lStyle&(~WS_CAPTION)&(~WS_THICKFRAME))


  ::SetWindowPos(hFig,NULL,0,0,0,0,SWP_NOMOVE|SWP_


  NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_


  FRAMECHANGED);CRect PlotRec;


  CWnd *PlotArea = GetDlgItem(IDC_STATIC_FIGURE);                                       //设置图像显示区域


  PlotArea->GetWindowRect(&PlotRec);


  long Width = PlotRec.right - PlotRec.left;


  long Height = PlotRec.bottom - PlotRec.top;


  ::SetParent(hFig,PlotArea->GetSafeHwnd());


  //设置图像的父窗口


  ::SetWindowPos(hFig,NULL,0,0,Width,Height,SWP_NOZORDER|SWP_NOACTIVATE);


  3.2基于Bitmap类的图像嵌入


  通过Bitmap类将Matlab生成的。bmp文件加载到VC工程中,使用Bitmap类中的成员函数对图像进行处理。由于相关函数可以通过帮助手册获取,所以此处不再给出相应代码,运行结果如图2所示。该方法避免了方法一生成图像时的闪烁现象,但是BMP图像显示效果较差而且无法使用Matlab提供的工具菜单,这是其不足之处。


  使用COM组件进行混合编程时,往往习惯于在VC平台下思考所遇到的问题,但是这样不仅使得问题可能变得复杂化,或得不到妥善解决,而且也违背了“混合”的初衷。二维数组参数处理就是一个很好的例证。其次,充分利用Matlab特性可以使得程序具备良好的扩展性和稳定性,对Excel文件读取方式进行的扩展,明显使软件更加人性化。对于图像嵌入问题,虽然文中提出的两种嵌入方式可以满足基本需求,但是仍然存在一些瑕疵,还需要进一步研究。

来顶一下
返回首页
返回首页
上一篇:利用OS任务调度来实现嵌入式数据管理
下一篇:通信工程之PFC的开关电源电路设计
 相关文章
 
 
跟贴共
笔 名 :   验证码:
网友评论仅供其表达个人看法,并不表明尚大教育同意其观点或证实其描述
距离2023年10月14日通信考试还有
通信各地考务机构
各省市通信报名简章