Matlab 教材:輸出數值

Matlab 的 diary 內建指令除了可以輸出數值之外, 還可以輸出產生那些數值的 Matlab 工作流程,這是 diary 的妙用。 但是,diary 輸出的數值是 ASCII 字碼, 純文字的數據資料雖然方便轉入其他程式做後續處理, 但是比較浪費磁碟空間。 例如一個雙精度浮點數

7.38905609893065
如果以 IEEE 數值資料型態儲存, 只需要 8 拜;如果以 ASCII 字碼儲存, 則每個數目字需要一個 ASCII 碼,加上小數點, 共要 16 拜。如果在這個數目字的前面寫四個空格,後面寫一個折列記號, 則又要加上 5 拜或 6 拜 (LF 或者 LF CR)。

Matlab 的 save 指令就是以 IEEE 數值資料型態, 將工作環境內的變數數值存入檔案,以備日後使用。 這樣儲存的檔案,副檔名一律是 MAT,故又稱為 MAT-file。 這種檔案不是純文字檔案,以 FTP 傳輸的時候必須指定為 binary 檔案。 MAT-file 可以被 Matlab 讀入工作環境, 也可以被 C, FORTRAN 或 Java 語言寫的程式讀取。 以後再說。

最簡單的用法就是

save
它將目前 Matlab 環境內的所有變數都儲存到目前工作檔案夾內的 matlab.mat。 如果目前工作環境內有 100 個 double 型態的變數,則每個變數佔有 8 拜的資料量, 總共 800 拜。 所以 MAT 檔案的大小,差不多就是 800 拜。 但是其實會稍微大一點,因為要加上 MAT-file 的檔頭和變數名這些資料。例如
>> whos
  Name      Size         Bytes  Class
  A        80x100        64000  double array
  s         1x13            26  char array
  x         1x15           120  double array
Grand total is 8028 elements using 64146 bytes
>> save
Saving to: matlab.mat
所有變數的資料含量是 64,146 拜, 而儲存後的 matlab.mat 檔案含量是 64,344 拜。

以下略為解釋 save 指令的其他用法。

save filename
將所有變數存檔,輸出的檔案是 filename.matfilename 可以指明一個絕對或相對的路徑, 如果沒有指明,就假設儲存在目前工作的檔案夾。
save filename a b c
將變數 a b c 的值儲存到 filename.mat 內。 小心指令內的參數以空格隔開,不要用逗點。
save filename a b c -append
一般來說新檔案會覆蓋 (overwrite) 同名的舊檔案, 若加了參數 -append 則新檔案會增修同名的舊檔案。 增修的意思是,如果 filename.mat 裡面已經有同名變數, 就用新的變數值覆蓋舊的值;否則就只是存入新的變數值。

save 指令其實可以用 ASCII 格式輸出變數的數值, 不過這個功能並不特別好用。請讀者覺得有需要的話自己學習。

Matlab 也提供非常一般性的檔案輸出功能, 例如它有類似 C 語言的 fopen(), fclose()fwrite() 函式, 這些函式的用法與 C 語言的同名函式如出一轍, 讀者如果能使用 C 語言,就能使用這些函式, 因此我們就不在此介紹了。

習題

  1. 利用 rand() 函式產生 10,000 個亂數,以 format long 將它們儲存在純文字檔案 rand.txt 內, 再以 IEEE 資料型態儲存在 rand.mat 內, 計算這兩個檔案含量的比值,四捨五入到整數位。
[BCC16-B]
單維彰 (2000/01/09) --- 2003/12/28
[Prev] [Next] [Up]