MATLAB與VC混合編程指導書

在調用 Matlab 引擎之前,首先應在相關文件中加入一行: #include "enging.h" ,該文件包含了引擎 API 函數的說明和所需數據結構的定義。可以在 VC 中調用的引擎函數分別如下:

1、引擎的打開和關閉

engOpen -打開 Matlab engine

函數聲明:

Engine *engOpen(const char *startcmd);

參數 startcmd 是用來啟動 Matlab 引擎的字符串參數,在 Windows 操作系統中只能為 NULL 。

函數返回值是一個 Engine 類型的指針,它是在 engine.h 中定義的 engine 數據結構。

EngClose -關閉 Matlab 引擎

函數聲明:

int engClose(Engine *ep);

參數 ep 代表要被關閉的引擎指針。

函數返回值為 0 表示關閉成功,返回 1 表示發生錯誤。

例如,通常用來打開 / 關閉 Matlab 引擎的代碼如下:

Engine *ep; // 定義 Matlab 引擎指針。

if (!(ep=engOpen(NULL))) // 測試是否啟動 Matlab 引擎成功。

{

MessageBox("Can't start Matlab engine!" );

exit(1);

}

. …………

engClose(ep); // 關閉 Matlab 引擎。

2、 向 Matlab 發送命令字符串

engEvalString -發送命令讓 Matlab 執行。

函數聲明:

int engEvalString(Engine *ep, Const char *string);

參數 ep 為函數 engOpen 返回的引擎指針,字符串 string 為要 matlab 執行的命令。

函數返回值為 0 表示成功執行,返回 1 說明執行失敗(如命令不能被 Matlab 正確解釋或 Matlab 引擎已經關閉了)。

3、 獲取 Matlab 命令窗口的輸出

要在 VC 中獲得函數 engEvalString 發送的命令字符串被 Matlab 執行後在 matlab 窗口中的輸出,可以調用 engOUtputBuffer 函數。

函數聲明:

int engOutputBuffer(Engine *ep, char *p, int n);

參數 ep 為 Matlab 引擎指針, p 為用來保存輸出結構的緩衝區, n 為最大保存的字符個數,通常就是緩衝區 p 的大小。該函數執行後,接下來的 engEvalString 函數所引起的命令行輸出結果會在緩衝區 p 中保存。如果要停止保存,只需調用代碼:engOutputBuffer(ep, NULL, 0) 。

4、讀寫 Matlab 數據

從 Matlab 引擎工作空間中獲取變量。

mxArray *engGetVariable(Engine *ep, const char *name);

參數 ep 為打開的 Matlab 引擎指針, name 為以字符串形式指定的數組名。

函數返回值是指向name 數組的指針,類型為mxArray* ( mxArray 數據類型在本文後面詳細簡介)。

向 Matlab 引擎工作空間寫入變量。

int engPutVariable(Engine *ep, const char *name, const mxArray *mp);

參數 ep 為打開的 Matlab 引擎指針, mp 為指向被寫入變量的指針, name 為變量寫入後在 Matlab 引擎工作空間中的變量名。

函數返回值為 0 表示寫入變量成功,返回值為 1 表示發生錯誤。

5、 調用引擎時顯示 / 隱藏 Matlab 主窗口

默認情況下,以engine 方式調用 Matlab 的時候,會打開 Matlab 主窗口,可在其中隨意操作。但有時也會干擾應用程序的運行,可用以下設置是否顯示該窗口。

int engSetVisible(Engine *ep, bool value);

參數 ep 為打開的 Matlab 引擎指針, value 為是否顯示的標誌,取值 true (或 1 )表示顯示 Matlab 窗口,取值 false (或 0 )表示隱藏 Matlab 窗口。

函數返回值為 0 表示設置成功,為 1 表示有錯誤發生。

要獲得當前 Matlab 窗口的顯示 / 隱藏情況,可以調用函數:

int engGetVisible(Engine *ep, bool *value);

參數 ep 為打開的 Matlab 引擎指針, Value 為用來保存顯示 / 隱藏情況的變量(採用指針方式傳遞)。

函數返回值為 0 表示獲取成功,為 1 表示有錯誤發生。

、數據類型 mxArray 的操作

在上面的 Matlab 引擎函數中,所有與變量有關的數據類型都是 mxArray 類型。數據結構 mxArray 以及大量的 mx 開頭的函數,廣泛用於 Matlab 引擎程序和 Matlab C 數學庫中。 mxArray 是一種很複雜的數據結構,與 Matlab 中的 array 相對應,我們只需熟悉 Matlab 的 array 類型和幾個常用的 mxArray 函數即可。

在 VC 中,所有和 Matlab 的數據交互都是通過 mxArray 來實現的,在使用 mxArray 類型的程序中,應包含頭文件 matrix.h ,不過在引擎程序中,一般會包含頭文件 engine.h ,該文件裡面已經包含了 matrix.h ,因此無需重複包含。

6.1 創建和清除 mxArray 型數據

Matlab 有很多種變量類型,對應於每種類型,基本上都有一個函數用於創建,但它們都有相同的數據結構,就是 mxArray 。

數組的建立採用mxCreatexxx 形式的函數,例如新建一個double 類型數組,可用函數mxCreateDoubleMatrix ,函數形式如下:

mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);

參數 m 和 n 為矩陣的函數和列數。 ComplexFlag 為常數,用來區分矩陣中元素是實數還是複數,取值分別為 mxREAL 和 mxCOMPLEX 。

例如,創建一個 3 行 5 列的二維實數數組,可用如下語句:

mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);

對應的,要刪除一個數組mxDestroyArray ,該函數聲明如下:

void mxDestroyArray(mxArray *array_ptr);

參數 array_ptr 為要刪除的數組指針。

例如,要刪除上面創建的數組 T ,可用如下語句:

mxDestroyArray(T);

類似的創建函數還有:

mxArray *mxCreateString(const char *str);

創建一個字符串類型並初始化為 str 字符串。

一般的在 VC 與 Matlab 交互中,以上兩種類型就夠了,其它類型數組的創建這裡不再介紹。

6.2 管理 mxArray 數據類型

6.2.1管理 mxArray 數據大小

要獲得 mxArray 數組每一維上元素的個數,可以用 mxGetM 和 mxGetN 函數。其中 mxGetM 用來獲得數組第一維的元素個數,對於矩陣來說就是行數。

int mxGetM(const mxArray *array_ptr); // 返回 array_ptr 對應數組第一維的元素個數(行數)

int mxGetN(const mxArray *array_ptr); // 返回 array_ptr 對應數組其它維的元素個數,對於矩陣來說是列數。對於多維數組來說是從第 2 維到最後一維的各維元素個數的乘積。

要獲得某一特定維的元素個數,則要用函數:

const int *mxGetDimensions(const mxArray *array_ptr);

該函數返回array_ptr 各維的元素個數保存在一個int 數組中返回。對於常用的矩陣來說,用 mxGetM 和 mxGetN 兩個函數就可以了。

另外還可以通過mxGetNumberOfDimensions 來獲得數組的總的維數,用 mxSetM 、 mxSetN 設置矩陣的行數和列數,函數說明如下:

int mxGetNumberOfDimensions(const mxArray *array_ptr); // 返回數組的維數

void mxSetM(mxArray *array_ptr, int m); // 設置數組為 m 行

void mxSetN(mxArray *array_ptr, int n); // 設置數組為 n 列

6.2.2 判斷 mxArray 數組類型

在對 mxArray 類型的變量進行操作之前,可以驗證以下其中的數組的數據類型,比如是否為double 數組、整數、字符串、邏輯值等,以及是否為某種結構、類、或者是特殊類型,比如是否為空數組,是否為 inf 、 NaN 等。常見的判斷函數有:

bool mxIsDouble(const mxArray *array_ptr);

bool mxIsComplex(const mxArray *array_ptr);

bool mxIsChar(const mxArray *array_ptr);

bool mxIsEmpty(const mxArray *array_ptr);

bool mxIsInf(double value);

…… ……

這些函數比較簡單,意義自明,不再解釋。

6.2.3 管理 mxArray 數組的數據

對於常用的 double 類型的數組,可以用mxGetPr 和 mxGetPi 兩個函數分別獲得其實部和虛部的數據指針,這兩個函數的聲明如下:

double *mxGetPr(const mxArray *array_ptr); // 返回數組 array_ptr 的實部指針

double *mxGetPi(const mxArray *array_ptr); // 返回數組 array_ptr 的虛部指針

這樣,就可以通過獲得的指針對 mxArray 類型的數組中的數據進行讀寫操作。例如可以用函數 engGetVariable 從 Matlab 工作空間讀入 mxArray 類型的數組,然後用 mxGetPr 和 mxGetPi 獲得數據指針,對並其中的數據進行處理,最後調用 engPutVariable 函數將修改後的數組重新寫入到 Matlab 工作空間。

小結

本文詳細的介紹了 Matlab 引擎使用方法並演示了一個簡單的利用 VC 調用 Matlab 畫圖的程序實例。大多數時候,程序員可以利用 Matlab 強大的數據讀寫、顯示能力和 VC 編程的高效率。例如,在 Matlab 中要讀入一幅任意格式的圖像均只需一條命令i=imread('test.jp'); 圖像數據矩陣便存放在了二維數組 i 中,可以通過 VC 讀入該數組進行相關處理再調用 Matlab 顯示,這種混合編程方式能大大提高工作效率。

當然,利用 VC 編譯的 Matlab 引擎程序,運行環境中還必須 Matlab 的支持,如果要編譯完全脫離 Matlab 的程序,可採用其它方式,如利用第三方 Matcom 程序編譯獨立的可執行程序等。

matlab engevalstring,Matlab 執行engEvalString命令介紹 | 學步園相关推荐

  1. 使用C#調用外部程式或是執行DOS命令

    在.NET裡要如何調用外部程式呢?? 在.net裡,提供了Process類,提供我們強大的調用外部工具功能,並透過重新導向輸入與輸出,可以取得執行結果,下面就用一個例子來示範在一個WinForm裡輸入 ...

  2. java中exec命令,使用Java中的Runtime.exec()執行Windows命令

    Runtime.getRuntime().exec()方法主要用於執行外部的程序或命令.Runtime.getRuntime().exec共有六個重載方法 : 其中public Process exe ...

  3. matlab colorbar采用对数,matlab colorbar的使用 | 學步園

    1:請問matlab中畫多張圖如何使用同一範圍的colorbar? 例如生成了圖1,2,3 生成圖1時,使用 temp1=caxis; 將圖1的z值的取值範圍(即colorbar的取值範圍)取出. 生 ...

  4. matlab怎么用wavedec,Matlab中wavedec使用學習及詳解 | 學步園

    最近在使用對ECG訊號進行小波係數的提取,所以用到了wavedec這個matlab中內置函數.然後盡心學習,發現還挺高深,不是我學到的衹是一點皮毛,因爲要對一段波形進行特徵提取,所以我要看哪個小波係數 ...

  5. matlab ellip,IIR濾波器設計(調用MATLAB IIR函數來實現) | 學步園

    % IIR濾波器設計 % 目的:設計一個採樣頻率為1000Hz.通帶截止頻率為50Hz.阻帶截止頻率為100Hz的低通濾波器,並要求通帶最大衰減為1dB,阻帶最小衰減為60dB. clc;clear; ...

  6. Linux移动光标指令hkjl,使用 HPC Pack 在 Linux VM 上執行 OpenFOAM - Azure Virtual Machines | Microsoft Docs...

    在 Azure 中的 Linux RDMA 叢集以 Microsoft HPC Pack 執行 OpenFoam 07/22/2016 本文內容 重要 傳統 Vm 將于2023年3月1日淘汰. 如果您 ...

  7. matlab 矩阵命令,matlab中的矩阵的基本运算命令

    matlab中的矩阵的基本运算命令 (2013-07-19 08:45:49) 1.1 矩阵的表示 1.2 矩阵运算 1.2.14 特殊运算 1.矩阵对角线元素的抽取 函数 diag 格式 X = d ...

  8. Matlab Tips: 高效实用的快捷命令

    目录 0. 概要 1. 注释与反注释:Ctrl+R, Ctrl+T 2. 代码格式化:Ctrl+I 3. 代码自动补全 3.1 自动显示函数接口 3.2 Tab键自动补全 4. 代码分块执行 5. 查 ...

  9. refresh matlab path,Matlab 习惯常用命令收集 转

    (1)管理命令和函数 addpath :添加目录到MATLAB搜索路径 doc :在Web浏览器上现实HTML文档 help :显示Matlab命令和M文件的在线帮助 helpwin helpdesk ...

最新文章

  1. 关于卷积神经网络的思考:将CNN视作泛函拟合
  2. thinkphp 模型的创建
  3. 直线矩阵数学之路(2)-四大神器-R(18)
  4. 怎么知道文本前后空格的字符格式_JDK 14的新特性:文本块Text Blocks
  5. 《算法竞赛入门经典》 例题 4-4 信息编码 (Message Decoding,ACM,ICPC World Finals 1991,UVa 213)
  6. 设计模式在Netty中的应用-观察者模式源码举例
  7. Multi-catch parameters are not allowed for source level below 1.7 解决方法
  8. Linux htop工具使用详解
  9. 【Maven】win10系统安装Maven
  10. cpu超频软件_AMD 锐龙7 3700X(默频)全面对决i7-9700K(超频至5.0GHz)
  11. Atitit 文件系统概论 艾提拉著 目录 1. NTFS系统 1 1.1.  NTFS文件系统概述 1 1.2.   1.1  文件系统简介  1.2  NTFS文件系统 1 1.3. 第2章
  12. 如何用vb制作“简单”的表白软件
  13. 偏向锁java_Java偏向锁
  14. linux下journalctl日志在哪,journalctl---系统日志
  15. 【渝粤题库】陕西师范大学163208 饭店管理 作业
  16. tableau public使用形状文件进行数据可视化
  17. 计算机网络自顶向下方法 第三章 运输层 3.4 可靠数据传输原理
  18. BlueTooth: 蓝牙基带数据传输机理分析
  19. android查询火车票接口,火车票查询信息接口
  20. direct wifi 投屏_告别Wifi直接投AOC无线投屏显示器轻松用

热门文章

  1. Light OJ 1316 A Wedding Party 最短路+状态压缩DP
  2. 【知乎】神回答,我们吐的不是槽 233
  3. html标签整合和css框架处理
  4. STL map常用操作简介
  5. django之关系及查询,数据类型,约束,分页
  6. 方法的形式参数是类名的时候如何调用
  7. JN_0005:PS改变图片指定内容颜色
  8. 【HDU2825】Wireless Password【AC自动机,状态压缩DP】
  9. Android开发中使用startActivityForResult()方法从Activity A跳转Activity B出现B退出时A也同时退出的解决办法...
  10. 高校网络中心主任挨骂冤不冤?