MATLAB函數的輸入參數傳遞方式探祕

      轉載一篇好文章,小修改了下,2011年新寫的,強大~

http://kecheng0927.blog.163.com/blog/static/116414616201109103916943/

      在各種語言中,輸入參數傳遞方法(地址傳遞、值傳遞)各有不同。如:

      VB :默認爲地址傳遞,可以指定用值傳遞

      C: 普通方式實現值傳遞,指針方式實現地址傳遞

      C++:比 C 多了引用傳遞,本質上是地址傳遞

      Fortran: 默認爲地址傳遞,可以指定使用值傳遞

      兩種傳遞方式的區別:

      1. 用地址傳遞方式可以在函數內部修改傳入的參數值,而值傳遞不可以。

      2. 值傳遞需要對輸入的參數進行拷貝,複雜的數據結構值傳遞時會降低程序執行的效率。

      那麼MATLAB的函數參數究竟用哪一種方式呢?

      查看幫助文檔得到結果:如果函數內部試圖修改輸入參數的值則爲值傳遞,如果沒有修改則爲地址傳遞。

      採用這一處理方式的目的是:

      1. 不允許函數內部修改輸入參數的值

      2. 兼顧執行效率(地址傳遞不需要將輸入參數拷貝一份)

      那麼我們可不可以去驗證一下呢?

      首先我們需要藉助一個mex函數,該函數的功能就是改變輸入參數的數值,由於該函數是藉助mex方式實現的,所以MATLAB無法檢測到我們修改了輸入參數的值。

      以下是該mex函數的代碼:mexChangeValue.cpp

      然後開始做實驗:

      我們可以看到輸出結果爲:

      0

      1.2000

      a 的值沒有改變,而 b 的值被改變了,說明在 fun1 中 "a = 3;" 之後,對輸入參數 a 做了一份拷貝,變爲“值傳遞”,而在 fun2 中剛開始進入函數時是“地址傳遞”的。

      結論:

      1. 在改變輸入參數的值之前是“地址傳遞”的,在改變輸入參數的值之後變爲“值傳遞”。

      2. 我們在編寫函數時,儘量不要對輸入參數重新賦值,尤其是對複雜的數據,這樣會降低執行效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章