首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC 與 MATLAB 聯合程式設計 (九) — 綜合實例一:曲線擬合

     編輯:關於VC++

開發環境

  • VC 6.0
  • MATLAB 6.5

功能說明

使用者輸入資料,程式完成資料的插值擬合並以圖形顯示。

前置準備

在 VC 中設定 MATLAB 函式庫與標頭檔路徑,參考《聯合程式設計 (六)(七)》。

步驟 1:撰寫 MATLAB 函數 ceshidll.m

function ceshidll(x,y)
a = min(x):0.1:max(x);
b = interp1(x,y,a,'spline'); % 一維插值
plot(x,y,'*',a,b);

步驟 2:使用 MATLAB Compiler (mcc) 編譯為 DLL

> mcc -t -W libhg:dlltest -T link:lib -h libmmfile.mlib ceshidll.m
參數說明:
-t           將 .m 檔編譯為 C/C++ 程式碼
-W libhg:dlltest  產生使用 C 圖形庫的 DLL,名稱為 dlltest
-T link:lib  產生連結庫
-h           包含所有被呼叫的輔助函數
libmmfile.mlib  連結所需共享函數庫
ceshidll.m   待編譯檔案

編譯完成於 MATLAB 當前目錄產生:ceshidll.c、ceshidll.h、dlltest.c、dlltest.exports、dlltest.h、dlltest.mlib、dlltest.exp、dlltest.lib、dlltest.dll。我們需要 dlltest.h、dlltest.lib、dlltest.dll。

步驟 3:建立 VC MFC 對話方塊專案 Fit

在對話方塊放入一個「擬合」按鈕。

對話方塊介面

圖 1

步驟 4:複製並加入編譯產生的檔案

將 dlltest.h、dlltest.lib、dlltest.dll 複製到專案目錄,並在 VC 中 Project → Add to Project → Files 加入前兩者。

步驟 5:加入標頭檔與匯入庫

在 FitDlg.cpp 頂端加入:

#include "matlab.h"
#include "dlltest.h"
#pragma comment(lib, "dlltest")

步驟 6:撰寫按鈕回應程式碼

void CFitDlg::OnButtonFit()
{
    UpdateData(TRUE);
    double X[100], Y[100];
    CString AA, BB, a;
    int i = 1;
    mxArray *A = NULL, *B = NULL;

    AA = m_edit1; BB = m_edit2;
    // ... 將字串轉換為數值陣列 X、Y ...

    mlfEnterNewContext(0, 0);      // 自動記憶體管理
    dlltestInitialize();           // 初始化 DLL
    mlfCeshidll(A, B);             // 呼叫 DLL 函數
    mxDestroyArray(A);             // 釋放矩陣記憶體
    mxDestroyArray(B);
    mlfRestorePreviousContext(0, 0);
}

執行結果

擬合結果圖

圖 2

結語

本範例實際上仍是呼叫函式庫,無論採用何種介面方式,函式庫都是最底層的實作。建議想精通介面程式設計的開發者熟練掌握 C/C++ 數學函式庫。MATLAB 7.0 對 C/C++ 介面有重大變更,不相容舊版,新版提供類別庫但使用體驗不佳。歡迎交流 (QQ: 44760299)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved