新闻中心

EEPW首页 > EDA/PCB > 设计应用 > Matlab强大的数组处理功能如何解决图像处理解析方

Matlab强大的数组处理功能如何解决图像处理解析方

作者:时间:2012-05-31来源:网络收藏

基于COM组件的与C++混合编程方式因拥有独立的运行环境和两种语言的互补优势而被众多科研人员和编程人员所接受,同时也是MathWorks公司推荐使用的混编方式。但在程序设计过程中,通常会遇到两个难点问题:(1)二维参数的传递与输出; (2)生成图形嵌入VC工程界面中。对于第一个问题,Bruce McKinney[1]在MSDN上指出;“如果对一维进行操作,则SAFEARRAY函数变的简单且易操作。但是对于多维,同样的操作要复杂得多”,造成这一问题的根源在于与C++对多维数组元素的存储方式不同。而在本项目开发过程中回避了这个复杂的过程,转而利用Matlab强大的数组将其解决。Matlab完善的图形是其被科研人员所推崇的原因之一,但因其图形拥有独立的窗口,严重影响了整体界面美观和用户交互体验,所以Matlab图形嵌入是混合编程中不可回避的问题。对此将通过实例介绍两种图形嵌入方法并分析说明其优缺点和相关细节。

本文引用地址:http://www.eepw.com.cn/article/190329.htm

本文示例均在Matlab R2008a和VC 6.0平台下完成,且通过调试能够正常运行。

1 Excel文件读取方法

VC平台下的Excel文件读取方式复杂难懂,但如果使用Matlab与VC的混合编程方式编写将更加简便,而且拥有较强的可扩展性。下面代码详细讲解了该过程。

(1)在Matlab平台下建立CExcelRead.m文件,代码如下:

function [output,row,col] = CExcelRead(filePath)

//filePath包含了指定文件的路径和文件名,由VC平台函数GetPathName()获取

[typ, desc] = xlsfinfo(filePath);

//xlsfinfo()可获取指定Excel文件中各个sheet工作区的名称,返回值存入名为desc的cell数组中

sheet1 = cell2mat(desc(1));

//默认打开”sheet1”(名称任意),并将其转换为字符串

output = xlsread(filePath,sheet1);

//返回该Excel文件中的数据,返回值存入output数组中

[row,col] = size(output);

//获取录入数据的行列值,返回到VC平台以供其拷贝指定内存大小的数据

output = reshape(output,row*col,1);

//将该二维数组转换为一维。这是第二部分二维数组处理的第一步

保存文件后,使用deploytool工具将其制作成名为FileOpen的COM(封装MCR),注册该控件并将相应的文件拷贝到MFC的工程中,对于基础操作此处不再赘述。

(2)在VC平台下创建名为PCA的基于对话框的MFC工程,添加一打开文件的按钮控件,ID为ID_FILE_OPEN。篇幅所限只给出部分核心代码,首先在Dlg类中添加3个私有成员变量用以保存Matlab读取的数据及行列值,即:

double *m_originData; long m_row, m_col;

在响应函数中添加如下代码

CFileDialog fileDlg(TRUE);

fileDlg.m_ofn.lpstrTitle=请选择你的excel数据;

fileDlg.m_ofn.lpstrFilter=Text Files(*.xls)*.xlsAll Files(*.*)*.*;

if(IDOK==fileDlg.DoModal() {

CString fileName; IFileOpenclass *pfile;

VARIANT filePath,output,rowOutput,colOutput;

//m文件的输入参数

fileName = fileDlg.GetPathName();

//获取文件路径并存于fileName中

CoInitialize(NULL); //COM初始化

HRESULT hr = CoCreateInstance(CLSID_FileOpenclass,NULL,CLSCTX_ALL,IID_IFileOpenclass,(void**)pfile);

//新建COM实例

VariantInit(filePath); //VARIANT数据初始化

filePath.vt = VT_BSTR; //指定filePath变量类型

//将fileName中保存的指定文件路径名保存至filePath参数中

filePath.bstrVal = fileName.AllocSysString();

pfile->CExcelRead(3,output,rowOutput, colOutput,filePath);

m_row=(long) rowOutput.dblVal;

//取出行列值及录入数据

m_col = (long) colOutput.dblVal;

m_originData = (double *)malloc(sizeof(double)*m_row*m_

col); memcpy(m_originData,output.parray->pvData,m_row*m_

col*sizeof(double));

//将matlab读入数据保存到m_originData供后面程序使用

}

c++相关文章:c++教程



上一页 1 2 3 4 下一页

评论


相关推荐

技术专区

关闭