新聞中心

        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.104case.com/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 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 筠连县| 宜兰县| 平顶山市| 丰县| 洪洞县| 鹤庆县| 龙门县| 石首市| 北流市| 昭苏县| 泊头市| 山西省| 象州县| 汝州市| 嫩江县| 济宁市| 南靖县| 石楼县| 浪卡子县| 镇雄县| 新乡市| 镶黄旗| 武威市| 阳新县| 河北区| 六枝特区| 鹤峰县| 甘德县| 庐江县| 舟曲县| 浙江省| 达州市| 伊吾县| 仪征市| 西峡县| 安宁市| 文山县| 渝北区| 六枝特区| 峨边| 岐山县|