1. 程式人生 > >[轉載]Matlab與Fortran的互動--基本概念

[轉載]Matlab與Fortran的互動--基本概念

轉載自 http://blog.sina.com.cn/s/blog_476687050100bw5j.html

如果需要進行Matlab環繞Fortran語言的互動,必須通過Matlab提供的應用程式設計介面(API)來實現與外部的介面,從而可以在Matlab 環境中實現呼叫Fortran程式、輸入或輸出資料以及和其它軟體程式間建立客戶/伺服器關係等功能。下面主要說一下在Matlab環境中如何實現呼叫 Fortran程式(函式)。

一  MEX檔案

    要在Matlab中呼叫Fortran程式碼,解決方法就是利用MEX檔案。MEX是Matlab Executable的縮寫。MEX檔案類似於M檔案,是Matlab系統的外部程式地用介面,是一種能夠在Matlab環境中可以被Matlab的解釋 器解釋並執行的函式檔案。MEX檔案可以直接使用C語言或Fortran語言來編寫,在相應的C語言或Fortran語言程式碼中,就可以呼叫已有的大量C 語言或Fortran語言演算法。利用MEX檔案可以完成:

1)在Matlab中使用已有的C語言或Fortran語言程式碼;

2)解決M語言執行速度的瓶頸;

3)隱藏演算法的細節;

4)擴充套件Matlab的能力。

    MEX檔案的使用極為方便,只需在Matlab命令提示符下鍵入MEX檔名即可,這與Matlab的內建函式的呼叫方式完全相同。Matlab系統規定,MEX檔案的執行優先順序高於M檔案。

二 mx-函式和mex-函式

    在Matlab外部程式介面函式庫中,存在兩種型別的庫函式,分別以mx和mex為字首,並且完成不同的功能。

1、mx-函式庫

mx-函式庫是Matlab外部程式介面函式庫中提供的一系列函式,它們均以mx為字首,主要功能是為使用者提供了一種在c語言和Fortran語言中建立、訪問、操作和刪除mxArray結構體物件的方法。

需注意的是,Fortran語言的mx-函式與C語言的mx-函式無論是在定義還是在使用上都存在很大的不同。

相關C語言中所用mx-函式均在目錄

<MATLAB根目錄>\EXTERN\INCLUDE

下的標頭檔案MATRIX.H中得到宣告。

2、mex 函式庫

mex- 函式庫也是Matlab外部程式介面函式庫中提供的一系列函式,它們均以mex為字首,主要功能是與Matlab環境進行互動,從Matlab環境中獲取必要的陣列資料,並且返回一定的資訊,包括文字提示,資料陣列等。

需注意的是,以mex為字首的函式只能用於MEX檔案中。

    相關C語言中所用mex-函式均在目錄

<MATLAB根目錄>\EXTERN\INCLUDE

下的標頭檔案MEX.H中得到宣告。

三 MEX原始檔的基本結構

    Fortran語言MEX原始檔是標準的Fortran語言原始檔(在建立Fortran語言MEX原始檔的時候可使用Fortran77或Fortran90的語言標準)。下面看一個簡單的例子。

c   入口函式//入口子例行程式(gateway routine)

    subroutine mexFunction(nlhs,plhs,nrhs,prhs)

c-----------------------------------------------

c   引數宣告

    integer plhs(*),prhs(*)

    integer nlhs,nrhs

    這裡mexFunction函式類似C語言原始檔的main函式,它是MEX檔案的入口函式。當在Matlab命令中執行MEX函式時,Matlab直譯器將從此函式處開始執行。該入口函式的輸入引數有四個,其意義分別是:

nlhs:表示輸入引數的個數

plhs:mxArray型別的指標陣列,表示MEX函式的輸入引數

nrhs:表示輸出引數的個數

prhs:mxArray型別的指標陣列,表示MEX函式的輸出引數

Matlab的資料在Fortran語言中沒有顯性的定義該資料結構,在Fortran語言MEX檔案中需要通過一種所謂的“指標”型別資料完成Fortran語言和Matlab之間的資料傳遞。

    入口函式之後就是MEX原始檔的程式主體部分了--計運算元例行程式(computational routine),在這裡需要完成Matlab資料的獲取和記憶體的分配,呼叫相應的計運算元程式或函式,完成MEX檔案的計算工作,最後將必要的輸出返回給Matlab。它是完全的Fortran語言程式設計,不涉及到任何的介面內容。

    程式的結尾是Fortran語言的特別要求,必須有return和end關鍵字作為Fortran語言源程式的結束。

需注意的是,在Fortran語言MEX檔案中只支援兩種型別的資料,即雙精度型別和字串型別,而在C語言MEX檔案中則幾乎支援所有的資料型別。

四 Fortran語言MEX檔案的執行流程

    當對一個Fortran語言MEX檔案的源程式進行編譯後,如果成功即可以得到與源程式名相同的DLL檔案(建議將源程式的取名與程式中計運算元例行程式的名字保持相同)。

在Matlab的工作環境中,按照Matlab語言的語法

[a,b,b,...]=mexfile_name(x,y,z,...)

正確鍵入MEX檔名和MEX檔案所需的引數,就可以執行MEX檔案了。這時,引數plhs和引數prhs分別為包含所有輸出和輸入引數地址的整型數足,引數nlhs和nrhs則分別包含了輸出和輸入引數的個數。