解析Matlab的workspace(1)
matlab裡面workspace一直算是所有變數的的內存空間的來使用。其中腳本和平常的command window佔據的一直是一個叫做『base』的workspace,不同的function佔據不同的workspace,一般來說,function佔據的workspace是與function同名的。
在matlab的基礎編程中,不同的workspace是不會產生數據交互的,除了在function的輸入輸出,但是在高級編程特性中,常用的兩條指令分別叫做evalin和assignin兩條指令可以打破其中的workspace的邊界,但是evalin和assignin兩條指令本身不被Matlab coder組件支持,而且像goto一樣,會讓程序看起來不規整,所以除了在debug的時候,不推薦在常規的matlab編程中使用。
我用靈魂草圖來介紹下這個workspace的東西,base一般是頂層空間,調用了func 1和func 2兩個函數,這兩者又分別調用了func1.1 func1.2和func 2.1和 func2.2。
當scr調用func 1的時候建立一個叫func 1的workspace,當func 1運行完成以後,消除掉func 1這個workspace。
再舉一個例子來講講有趣的『base』和『caller』
v = evalin(base, var);
這是一條標準的evalin的指令,從base中取出一個叫var的變數,並且賦給當前workspace的v變數。
但是如果把base改成caller,就是說當前workspace的上級workspace空間,比如對於func1.1 1.2那麼他們的caller就是func1,但是對於func1的caller就是base空間。
網上有一些資料是推薦在常規編程中採用evalin/assignin指令的,在此我申明我是非常反對的,我在聽取了一些意見和我自己試了很多次有以後,基於以下三個理由不推薦常規編程中使用的:
一。Coder不支持,Coder的用處,我以前專門寫文章寫過(matlab小工具-Matlab Coder - 知乎專欄)。
二。程序可讀性完全亂掉,因為你的當前workspace一些變數在其他的function遠程操作,這既不是面向結構編程,也不是面向對象編程。
三。matlab的高級特性的不靠譜,熟悉matlab的朋友應該都知道,matlab的一個高級特性單獨使用一般沒什麼,但是一旦一次用兩個或者多個,一般很多時候會發生一些不可知的錯誤。evalin/assignin明顯算一個高級特性,但是又不算特別有用,這個空缺完全可以留給其他的高級特性。
-------------------------明天寫關於global persisten對於workspace的影響,為(二)---------------
推薦閱讀:
※正版的matlab以及mathematica比盜版的優勢是什麼?
※偽隨機數
※Wolfram Mathematica 有哪些比較好(有特色,有用)的Package?
※Matlab 2015a安裝激活後打開時顯示License Manager Error-8,怎麼解決?
※為什麼Mathematica中無法Manipulate一個先前定義的變數中的參數?