Matlab強(qiáng)大的數(shù)組處理功能如何解決圖像處理解析方
上述C++代碼中省略了異常處理和相關(guān)的內(nèi)存、COM釋放代碼,由于代碼比較簡單所以不做進(jìn)一步解析。請注意,下面將省略COM初始化及實(shí)例化等相同代碼。
(3) 需要重點(diǎn)說明的是該方法的擴(kuò)展性。通常Excel文件中保存多個工作區(qū),有時用戶可能需要打開同一Excel文件中不同工作區(qū)中的數(shù)據(jù),常規(guī)方法實(shí)現(xiàn)過于復(fù)雜,但對于本文介紹的方法可以通過修改添加幾條語句即可實(shí)現(xiàn)。首先,新建一個m文件用來處理工作區(qū)的選擇,代碼如下:
function [sheet,col] = CSheetSelected(filePath)
[typ, sheet] = xlsfinfo(filePath);
[row,col] = size(sheet);
由于返回值是一個cell數(shù)組,所以VC平臺要使用CStringArray數(shù)據(jù)結(jié)構(gòu)保存返回值,并顯示各工作區(qū)名稱供用戶選擇。然后,通過人機(jī)交互將用戶選擇的工作區(qū)參數(shù)保存并傳遞至CExcelRead.m,通過在CExcelRead.m增加一個工作區(qū)選擇參數(shù),并對代碼稍作修改即可。
2 二維數(shù)組參數(shù)的傳遞與輸出[2]
下面以主成分分析為例介紹基于COM的Matlab與VC混合編程中二維數(shù)組參數(shù)處理。
(1) 主成分分析pcamat.m代碼如下:
function [eigenvector,eigenvalue] = pcamat(oriData,row,column)
//在Excel讀入時已經(jīng)完成了二維數(shù)組輸出的關(guān)鍵步驟,即輸出時將二維數(shù)組轉(zhuǎn)換為一維數(shù)組。但在VC平臺接收還原為二維時要注意,Matlab數(shù)組存儲方式是按列存儲,而VC平臺下數(shù)組是按行存儲,所以轉(zhuǎn)換時0~row-1為第一列,row~2*row-1為第二列,以此類推。本文輸入?yún)?shù)oriData是一維數(shù)組,所以要將其還原為二維數(shù)組使Matlab程序能夠正常運(yùn)行,即下一行代碼所示。
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);
//第三行至此處均為主成分分析內(nèi)容
eigenvector = reshape(eigenvector,column*column,1);
//與Excel文件讀取時類似,將二維輸出轉(zhuǎn)換為一維數(shù)組進(jìn)行輸出
(2) 保存后,封裝打包為COM組件,并完成注冊等相關(guān)操作。在PCA工程對話框上添加一個名為PCATest的按鈕控件,核心代碼如下:
VARIANT oriData,row,column,eigVector,eigValue;
VariantInit(oriData); //參數(shù)初始化
oriData.vt = VT_R8|VT_ARRAY;
//定義SAFEARRAY類型的一維數(shù)組
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;
//完成相關(guān)設(shè)置后,將第一步讀入的數(shù)據(jù)錄入到oriData中,即賦給pcamat的oriData。到此完成了二維數(shù)組的傳遞
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));
綜上,二維數(shù)組參數(shù)處理就是使用reshape()函數(shù)對輸入輸出數(shù)據(jù)維數(shù)進(jìn)行變換來完成操作。
c++相關(guān)文章:c++教程
評論