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

时间:2012-05-31来源:网络

上述C++代码中省略了异常处理和相关的内存、COM释放代码,由于代码比较简单所以不做进一步解析。请注意,下面将省略COM初始化及实例化等相同代码。

(3) 需要重点说明的是该方法的扩展性。通常Excel文件中保存多个工作区,有时用户可能需要打开同一Excel文件中不同工作区中的数据,常规方法实现过于复杂,但对于本文介绍的方法可以通过修改添加几条语句即可实现。首先,新建一个m文件用来处理工作区的选择,代码如下:

function [sheet,col] = CSheetSelected(filePath)

[typ, sheet] = xlsfinfo(filePath);

[row,col] = size(sheet);

由于返回值是一个cell数组,所以VC平台要使用CStringArray数据结构保存返回值,并显示各工作区名称供用户选择。然后,通过人机交互将用户选择的工作区参数保存并传递至CExcelRead.m,通过在CExcelRead.m增加一个工作区选择参数,并对代码稍作修改即可。

2 二维数组参数的传递与输出[2]

下面以主成分分析为例介绍基于COM的Matlab与VC混合编程中二维数组参数处理。

(1) 主成分分析pcamat.m代码如下:

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

//在Excel读入时已经完成了二维数组输出的关键步骤,即输出时将二维数组转换为一维数组。但在VC平台接收还原为二维时要注意,Matlab数组存储方式是按列存储,而VC平台下数组是按行存储,所以转换时0~row-1为第一列,row~2*row-1为第二列,以此类推。本文输入参数oriData是一维数组,所以要将其还原为二维数组使Matlab程序能够正常运行,即下一行代码所示。

oriData = reshape(oriData,row,column);

dataSTD=std(oriData,0,1); dataMean = mean(oriData);

dataSR = (oriData-dataMean(ones(row,1),:))./dataSTD(ones(row,1),:);

[eigenvector,newdata,eigenvalue,Exa]=princomp(dataSR);

//第三行至此处均为主成分分析内容

eigenvector = reshape(eigenvector,column*column,1);

//与Excel文件读取时类似,将二维输出转换为一维数组进行输出

(2) 保存后,封装打包为COM组件,并完成注册等相关操作。在PCA工程对话框上添加一个名为PCATest的按钮控件,核心代码如下:

VARIANT oriData,row,column,eigVector,eigValue;

VariantInit(oriData); //参数初始化

oriData.vt = VT_R8|VT_ARRAY;

//定义SAFEARRAY类型的一维数组

SAFEARRAYBOUND rgsadound[1];

rgsadound[0].lLbound = 0;

rgsadound[0].cElements = m_row*m_col;

oriData.parray = SafeArrayCreate(VT_R8,1,rgsadound);

oriData.parray->pvData = m_originData;

//完成相关设置后,将第一步读入的数据录入到oriData中,即赋给pcamat的oriData。到此完成了二维数组的传递

row.vt = VT_I4; col.vt = VT_I4;

row.lVal = m_row; col.lVal = m_col;

pca->pcamat(2,eigVector,eigValue,oriData,row,col);

memcpy(result, eigVector.parray->pvData,m_col*m_col*

sizeof(double));

综上,二维数组参数处理就是使用reshape()函数对输入输出数据维数进行变换来完成操作。

1 2 3 4

关键词: Matlab 数组 处理功能 如何解决

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版