新聞中心

        EEPW首頁 > EDA/PCB > 設計應用 > Matlab強大的數組處理功能如何解決圖像處理解析方

        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的與VC混合編程中二維參數處理。

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

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

        //在Excel讀入時已經完成了二維數組輸出的關鍵步驟,即輸出時將二維數組轉換為一維數組。但在VC平臺接收還原為二維時要注意,數組存儲方式是按列存儲,而VC平臺下數組是按行存儲,所以轉換時0~row-1為第一列,row~2*row-1為第二列,以此類推。本文輸入參數oriData是一維數組,所以要將其還原為二維數組使程序能夠正常運行,即下一行代碼所示。

        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()函數對輸入輸出數據維數進行變換來完成操作。

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




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新郑市| 萝北县| 定安县| 庐江县| 清水县| 怀柔区| 南投县| 溧阳市| 万全县| 满城县| 武定县| 百色市| 沁水县| 遵义市| 晋城| 绵竹市| 甘南县| 临洮县| 浮山县| 平顶山市| 兰坪| 龙井市| 炎陵县| 出国| 栾城县| 盐城市| 北安市| 登封市| 阳新县| 宜城市| 东平县| 大田县| 寿宁县| 宁安市| 长阳| 梅州市| 乌拉特中旗| 东港市| 稻城县| 漳浦县| 威信县|