摘要:本文簡要介紹了Matlab,闡述了階乘的概念,并給出了階乘算法在Matlab中的幾種實現方案。
關鍵詞:matlab;mex;階乘;函數
中圖分類號:TP312文獻標識碼:A文章編號:1009-3044(2008)16-21258-02
Several Ways of Achieving Factorial Algorithm in Matlab
XU Hui-yan1,HU Peng2
(1.Huaiyin Teachers College,Huaian 223300,China;2.Huaian college of Information Technology,Huaian 223003,China)
Abstract:The paper introduced Matlab briefly,and illustrated the conception of factorial. It gave us Several Ways of Achieving factorial algorithm in Matlab.
Key words:matlab;mex;factorial;function
1 Matlab簡介
Matlab是由美國的Cleve Moler為了學生而用FORTRAN語言編寫的關于EISPACK和LINPACK的接口程序,后經他和John Little,Steve Bangert等人一起用C語言進行了完善,并作了進一步開發。Matlab早期是用來進行工程和科學計算的,但隨著時代的變遷,自身的不斷完善和充實,如今Matlab已發展成為眾多行業不可缺少的軟件之一,如數理統計、工程計算、圖形圖像處理、仿真與建模、生物遺傳、控制系統設計與分析等領域。但Matlab和其他高級語言相比,程序執行時以解釋方式工作,不用編譯,源程序讀一句,翻譯一句,執行一句,輸入程序立即顯示結果,從而導致程序執行速度降低。為了彌補這一不足,我們可以借助其他語言,進而實現提高程序的運行效率。
2 什么是階乘
階乘,又稱factorial,它是基斯頓?卡曼(Christian Kramp)發明的運算符號,用“!”表示,指從1一直乘到n的數。表達式如下:
n!=1*2*3*4*……*n其中n∈N
如要求5的階乘,則可表示為
5!=1*2*3*4*5
結果為120。另規定1!=1,0!=1。
3 階乘算法實現
3.1 調用Matlab函數
3.1.1 調用factorial函數
Matlab提供了豐富多樣的函數庫,且用戶使用方便,如求階乘的函數factorial(),假設用戶需求20的階乘,則用戶可直接在Matlab命令窗口中輸入factorial(20),然后運行,可得ans=2.4329e+018。在這里,factorial(N)為N的階乘, 是從1到N的所有整數之積, 即prod(1:N) 。當N 是一個N維數組時, factorial(N) 是N 的每個元素的階乘。因為雙精度數字只有約15位,所得結果僅在N < = 21時準確。對于更長的N,結果只能精確到前15位。
3.1.2 調用Prod函數
在Matlab中Prod(x)是計算向量x的元素總乘積,而Prod(1:n)是求1……n的總乘積,用它也可實現計算n的階乘,若需求20!,則可在Matlab命令窗口中輸入Prod(1:20),然后運行,同樣可得ans=2.4329e+018。
3.1.3 調用Gamma函數
Gamma函數內插factorial 函數,對于整型量 n,有 gamma(n+1) = n! = factorial(n)。同樣若需求20!,在Matlab命令窗口中輸入gamma(21),然后運行,可得ans=2.4329e+018。
3.2 調用M文件
在Matlab中,除了調用它自身提供的函數,我們也可以自己編寫函數。通常,我們將編寫好的文件保存為文本文件,后綴為.m,一般稱它為M文件。M文件是一個文本文件,可以用各種文本文件對它進行修改,也可以使用MATLAB內建的M文件編輯器。可以通過兩種方法執行M文件,一是直接在調試窗口中利用功能菜單的調試命令完成;二是將在“調試窗口”中保存好的M文件的文件名在“命令窗口”中輸入,然后執行即可。
以下為求n!的代碼:
function y=control(x)
if (x==1) || (x==0)
y=1;
else
y=x*control(x-1);
end
將此程序保存為Control.m,然后在命令窗口中輸入y=control(20),可得y=2.4329e+018。在這里我們運用了遞歸算法求階乘,遞歸公式為:
它的執行流程如圖1。
圖1 control執行流程
3.3 調用MEX接口
MEX是Matlab EXecutable的縮寫,是Matlab和其它高級語言混合編程的接口,如C/C++,VB,Delphi等。對于已有的或普通的C/C++等源程序,只要通過MEX接口函數就可在Matlab中像自身函數一樣調用,方便快捷,而且對于某些復雜的程序還能夠提高它的運行效率。MEX需要調用外部的語言編譯器來產生MEX文件,所以編譯MEX文件之前需要安裝必要的編譯器。本例需要安裝的是C語言編譯器。主要代碼如下:
計算函數factorial:
j=1;
if (n==1.0 || n==0)
j=1;
else
{for(i=n;i>1;i--)
j=j*i;
}
入口子程序mexFunction:
mrows=mxGetM(prhs[0]);
ncols=mxGetN(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(mrows, ncols, mxREAL);
x=mxGetPr(prhs[0]);
y=mxGetPr(plhs[0]);
factorial (y, x);
在利用MEX接口調用函數時,一定要在程序的開頭加上頭文件\"mex.h\",將程序代碼保存為factorial.c,然后在Matlab命令窗口中鍵入mex factorial.c運行,輸入y=factorial(20)執行,顯示結果y=2.4329e+018。
4 小結
在實驗中有很多人不知道如何在Matlab中實現階乘的計算,本人通過總結給出了階乘算法的幾種實現方法,供大家參考,與大家共同學習。
參考文獻:
[1] 飛思科技產品研發中心.MATLAB6.5應用接口編程[M].電子工業出版社,2003.
[2] 樓順天,陳生潭,雷虎民.MATLAB5.x程序設計語言[M].西安電子科技大學出版社,2000.
[3] 飛思科技產品研發中心.MATLAB7基礎與提高[M].電子工業出版社,2006.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。