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

C++ Builder 與 MATLAB 混合程式設計:Mediva 平台實作指南

     編輯:關於C++

在 C++Builder 中呼叫 MATLAB 工具箱函數有兩種路徑:依賴 MATLAB 環境或完全脫離 MATLAB 使用 Mediva 平台。Mediva (MathTools) 提供 MATLAB 基礎函數解譯執行環境與 M 檔轉 DLL 編譯功能,版本 4.5 僅 6.5MB,支援 Borland C++、VB、Delphi。本文詳述直接呼叫 MATLAB 函數與工具箱函數轉 DLL 兩種模式。

一、Mediva 平台簡介

  • 提供近千個 MATLAB 基礎函數(運算、I/O、線性代數、控制等)。
  • 優點:無需安裝龐大 MATLAB,直接在 C++Builder 中呼叫。
  • 缺點:需攜帶 ~4MB DLL,不支援部分類別庫設計的函數(如 tf 類)。

二、C++Builder 直接呼叫 MATLAB 函數

  1. 產生 .lib:DOS 下執行 implib mdv4300.lib mdv4300.dll,連同 ago4300.dll 放入專案目錄。
  2. 包含標頭:#include "matlib.h" 必須置於第一行,定義所有型別、常數、函數宣告。
  3. 呼叫語法差異:MATLAB plot(x,'r') → C++ plot(CL(x), TM("r")),CL 標示多變數輸入,TM 標示字串。

範例:128 點 FFT 頻譜繪製

#include "matlib.h"
#include <vcl.h>
#pragma hdrstop
#include "TryMatcomU.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {}
void __fastcall TForm1::Button1Click(TObject *Sender) {
    initM(MATCOM_VERSION);
    Mm cur1 = zeros(128), cur2 = zeros(128);
    for (int k=1; k<=128; k++) cur1.r(k) = randM();
    figure(1); plot(cur1);
    cur2 = fft(cur1, 128);
    figure(2); stem(CL(cur1), real(cur2), TM("r")); // 火柴棒圖
    exitM();
}

三、M 函數轉 DLL 並由 C++Builder 呼叫

  1. Mediva 將含輸入參數的 M 檔轉為 DLL,產生 flower.cpp/h、g_flower.cpp。
  2. 需修正 g_flower.cpp 中 in01 宣告錯誤,並撰寫 .mak 編譯連結。
  3. C++ 呼叫前必須為輸出參數配置記憶體(new Mm())。

修正後 DLL 匯出函數

extern "C" {
void DLLX _stdcall flower_1_1(Mm in01, Mm **out01) {
    *out01 = new Mm(); **out01 = flower(in01); exitM();
}
void DLLX _stdcall flower_1_2(Mm in01, Mm **out01, Mm **out02) {
    *out01 = new Mm(); *out02 = new Mm();
    flower(in01, i_o, **out01, **out02); exitM();
}
}

注意事項

  • MATLAB 5.0+ 含 tf 類函數無法轉換;4.2 版轉換後多需人工修正。
  • 直接呼叫模式適合一般運算;DLL 模式適合部署無 MATLAB 環境的機器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved