Matlab‎ > ‎

檔案和目錄管理

精通Matlab 6 第十三章 中譯

第十三章 檔案和目錄管理(File and Directory Management)

MATLAB以各種檔案格式來開始及儲存資料檔,其中有些檔案格式是適合MATLAB的格式,其它的則是工業標準,還有一些其它的檔案格式適合其它的應用程式。被用來開啟和儲存資料檔的技術包含了GUI和Command window函式。
像大部份現代的應用程式,MATLAB使用目前的目錄當作是預設的資料和M-file的位置。利用GUI和Command window函式可以是目錄管理工具和改變目前的目錄。
本章涵蓋了MATLAB中檔案和目錄管理的特性。

13.1 原始資料檔(NATIVE DATA FILES)
藉由使用save 命令,MATLAB workspace中的變數可以以MATLAB原始格式來儲存。例如,

>> save

以MATLAB二元格式儲存所有在MATLAB workspace中的變數於目前目錄下的matlab.mat檔案中。這些原始二元MAT-files維持完整的雙精度就和變數被儲存的名稱一樣。MAT-file並非平台獨立的,不過卻是完全跨平台相容的(cross-platform-compatible)。被儲存在一平台上的變數可以不經特殊的處理就在其它MATLAB平台上被開啟。
Save命令也可以用來儲存特殊變數。例如,

>> save var1 var2 var3

只儲存變數var1, var2和var3到matlabmat中。檔案名稱可以被指定為save的第一個引數。例如,

>> save filename var1 var2 var3

儲存變數var1, var2和var3到filename.mat中。
使用命令-函數的對偶性,上述命令型式也可以被寫為函式型式如

>> save (' filename', 'var1', 'var2','var3')

此特別的格式在檔案名稱被儲存在MATLAB字元字串中時會很有用,例如,

>> fname='myfile'
>> save (' fname', 'var1', 'var2','var3')

在此,有名稱的變數被儲存在名為myfile.mat的檔案中。

除了上述簡單的型式外,save命令也支援儲存到ASCII文字格式的選項,並且可被用來增加資料到目前已經存在的檔案中。若需這些特性的輔助說明,請參考線上輔助說明。

與save互補的就是load命令了。此命令開啟已由save命令建立的資料檔,或是與save命令相容的檔案。例如,

>> load

會讀取所有從matlab.mat中找到的變數,而無論從目前目錄下找到的或是在MATLAB搜尋路徑上找到的,此matlabmat檔是先找到的那一個。原本儲存在matlabmat中的變數名稱現在於workspace中還原了,且它們會覆寫在workspace中相似名稱的變數。
要從MAT-file中讀取特定變數,你必須包含檔案名稱和變數列表,例如,

>> load filename var1 var2 var3
>> load (' filename', 'var1', 'var2','var3')

在此filename.mat被開啟,而變數var1,var2和 var3被讀取到workspace中。第二個陳述式說明load命令的函式型可讓資料檔被指定為字元字串。雖然沒有顯示山來,filename字串可以包含完整的或部份的路徑,因此限制load去在特定的目錄尋找資料檔。
上面較後面的例子提供了一個開啟一連串以數字編號的資料檔的方法,例如mydata1.mat,mydata2.mat,等...,如下例

for i=1:N
fname=sprintf('mydata%d',i);
load(fname)
end

此程式碼片段使用sprintf來在For迴圈中建立檔案名稱字串,使得一連串的資料檔被讀取到workspace中。
當你不希望覆寫workspace中的變數時,load命令可以以函數型撰寫,並給定輸出引數。例如,

>> vnew=load('filename','var1','var2');

開啟檔案filenamemat並且讀取變數var1和var2到一個名為vnew,並具有欄位var1和var2的結構(structure)變數中。也就是,vnew.var1=var1且vnew.var2=var2。
load命令也可以開啟ASCII文字檔。特別是,如果由MATLAB的註解行和數列由空白字元分隔的數值所構成的資料檔,語法

>> load filename.ext

開啟檔案filename.ext並讀取資料到一個名為filename的單雙精度資料陣列。若需關於load命令更詳盡的資訊,請見線上輔助說明。
要找出是否資料檔中存在且它存有什麼變數,MATLAB命令exist和whos會很有用。例如,

>> exist('matlab.mat','file')

會傳回0如果file不存在,會傳回2如果它存在

>> whos -file matlab.mat

對於包含在檔案matlab.mat中的變數,會傳回標準whos於Command window的顯示。另一個方法,

>> w=whos('-file','matlab.mat')
w = 
3x1 struct array with fields:
name
size
bytes
class

傳回有著「為了whos的顯示」而命名的欄位的結構陣列。使用此方式,變數的名稱,大小,記憶體和class都會被儲存在變數中。
最後,不過並非不重要,資料檔可以使用Command window命令delete來被刪除。例如,

>> delete filename.ext

會刪除名為filename.ext的檔案。
在MATLAB版本6中資料檔管理函式可被從Workspace space 瀏覽器中及輸入精靈(Import wizard)存取。藉由選擇在MATLAB desktop上View選單中的Workspace,Workspace space 瀏覽器可以被檢視。藉由從File選單中選擇Import Data...,或在Command window中鍵入uiimport,輸入精靈(Import wizard)會出現,它是一個使讀取多種格式的資料,而非只是MATLAB原本MAT-file格式的工作變得更容易的通用性GUI。

13.2 資料輸入和輸出(DATA IMPORT AND EXPORT)

除了MATALB原本的MAT-file格式和方便的ASCII文字格式外,MATLAB支援多種工業標準格式和其它常見的檔案格式。有些格式被限制只能讀,而其它的只能寫。有些格式被限制在影像上,其它則是多媒體或是試算表。這些資料輸入和輸出函式和功能使得MATLAB得以與其它程式交換資料。
Figure window的影像可以使用在Figure window File選單上的Save項目來被存為原本的MATLAB FIG-file格式 。此外,Figure window的影像可以藉由選擇Figure window的File選單上的Export...被輸出為各種格式。Command window函式saveas對於以GUI為本的方式提供另一種方法。若需關於使用saveas的輔助,請見線上文件。
在MATLAB中可用的特定資料的輸入和輸出函式包含下表中所列的那些函式。

函式 描述
dlmread 讀取有界定符號的文字檔
dlmwrite 寫入有界定符號的文字檔
textread 從檔案中讀取格式化的文字
wklread 讀取試算表檔案
wklwrite 寫入試算表檔案
xlsread 讀取試算表檔案
aviread 讀取電影(movie)檔
imread 讀取影像檔
imwrite 寫入影像檔
auread 讀取Sun音訊(sound)檔
auwrite 寫入Sun音訊檔
wavread 讀取Microsoft音訊檔
wavwrite 寫入Microsoft音訊檔
hdf 進入HDF檔案的能力

這些函式中的每一個的輔助說明都提供了關於其使用法的資訊。尤其是函式imread和imwrite更支援多種格式。支援的格式包含了JPEG, TIFF, BMP, PNG HDF, PCX和XWD。Fileformats的輔助說明提供了更完整的MATLAB支援的檔案格式列表,例如,

>> help fileformats

Readable file formats.

Text formats Command Returns
MAT - MATLAB workspace load Variables in file.
CSV - Comma separated numbers csvread Double array.
DLM - Delimited text dlmread Double array.
TAB - Tab separated text dlmread Double array.

Spreadsheet formats
XLS - Excel worksheet xlsread Double array and cell array.
WK1 - Lotus 123 worksheet wk1read Double array and cell array.

Movie formats Command Returns
AVI - Movie aviread MATLAB movie.

Image formats
TIFF - TIFF image imread Truecolor, grayscale or indexed image(s).
PNG - PNG image imread Truecolor, grayscale or indexed image.
HDF - HDF image imread Truecolor or indexed image(s).
BMP - BMP image imread Truecolor or indexed image.
JPEG - JPEG image imread Truecolor or grayscale image.
GIF - GIF image imread Indexed image.
PCX - PCX image imread Indexed image.
XWD - XWD image imread Indexed image.
CUR - Cursor image imread Indexed image.
ICO - Icon image imread Indexed image.

Audio file formats
AU - NeXT/Sun sound auread Sound data and sample rate.
WAV - Microsoft Wave sound wavread Sound data and sample rate.

13.3 低階的檔案輸入/輸出(LOW-LEVEL FILE I/O)

因為存在著無限種的檔案型別,MATLAB提供低階檔案I/O函式以便讀取或寫入任何可想見的二元或格式化的ASCII檔案。這些函式非常相佽於它們的ASCIC語言中的對應函式,不過它們的特性並不需要完全配適。事實上,許多上面描述迥的特殊目的檔案I/O命令在內部使用這些函式。在MATLAB中的低階檔案IO函式如下表所示。

類別 函式 描述/語法範例
檔案開啟和關閉 fopen 開啟檔案。fid=fopen('filename', 'permission')
fclose 關閉檔案。status=fclose(fid)
二元I/O fread 讀取部份或整個二元檔。A=fread(fid,num,precision)
fwrite 將陣列寫到二元檔裡。count=fwrite(fid,num,precision)
格式化I/O fscanf 從檔案讀取格式化資料A=fscanf(fid,format,num)
fprintf 將格式化資料寫到檔案中count=fprintf(fid,format,A)
fgetl 從檔案讀取行;忽略換行字元(newline character)line = fget1(fid)
fgets 從檔案讀取行;保留換行字元(newline character)line = fgets(fid)
字串轉換 sprintf 將格式化資料寫到字串中。S=sprintf(format,A)
sscanf 在格式控制下讀取字串。A=sscanf(String,format,num)
檔案取位 ferror 詢問關於檔案I/O的狀態message=ferror(fid)
feof 測試檔案的結束與否。TF=feof(fid)
fseek 設定檔案位置指示器(indicator)。status=fseed(fid,offset,origin)
ftell 取得檔案位置指示器(indicator)。position=ftell(fid)
frewind 倒回檔案起點frewind(fid)

在上表中,fid是檔案的辨識號碼(identifier number),而permission是用來辨識需求許可的字元字串。可能的字串有唯讀的'r'、唯寫的'w',和只可附加的'a',及可讀寫的'r+'。因為PC個人電腦會區別文字和二元檔,當以二元檔作業時,'b'一定常常會被加到perssion後面,例如,'rb'。在上表中是一個定義想要格式的字元字串。Format非常嚴格地遵循ANSI 標準的C。更多關於使用這些函式的資訊可以在每個函式的線上文件中找到。

13.4 目錄管理(DIRECTORY MANAGEMENT)

第6版的MATLAB有全新的視窗,這意味著在GUI中管理目前目錄和其檔案變得可行。藉由從在MATLAB desktop中的View選單選擇Current Directory會顯示Current Directory window。除了在樹狀目錄中逛之外,此GUI讓你預視在目前目錄中的檔案、查看它們被修改的日期、在-file中搜尋文字、建立新目錄和新M-file,等...。因為目前目錄的基本效用,它也可以在MATLAB desktop window中的pop-up選單中被顯示。因此,總可以藉由查看桌面的工具列便能輕鬆地知道目前的目錄。

在第6版之前的MATLAB中,目錄管理經由使用Command window函式來操作。雖然這些函式在第6版中的重要性不如以往,它們仍然提供重要的功能。特別是,大部份的函式有傳回MATLAB內變數的目錄和檔案資訊的能力,因此可讓複雜的檔案和目錄處理在函式M-file中完成。在MATLAB中Command window目錄管理可用的函式整合如下表。

函式 描述
cdpwdS=cd; 顯示目前工作的目錄。傳回目前工作的目錄為S中的字串。
cd dirname 將目前工作的目錄改為dirname。
copyfile(oldname, dirname)copyfile(oldname, newname) 將檔案oldname複製到目錄dirname中。將檔案oldname複製為newname。
delete filename.ext 刪除檔案filename.ext。
dirlsS=dir; 顯示在目前目錄中的檔案。傳回目錄資訊於結構S中。
mkdir dirname 在目前的目錄中建立dirname目錄
WhatS=what; 以組織過的一張表顯示在目前目錄中,所有的MATLAB檔案。傳回資訊列表於結構S中。
which filenameS=which('filename') 顯示filename的目錄路徑。傳回目錄路徑到S中的一個字串filename。
whowho –file filenameS=who ('-file', 'filename') 顯示在workspace中的變數。顯示在MAT-file filename.mat中的變數。傳回在filename.mat的變數於巢狀陣列S中。
whoswhos –file filenameS=whos('-file', 'filename') 顯示在workspace中的變數、大小和class。顯示在MAT-file filename.mat中的變數、大小和class。傳回在filename.mat的變數、大小和class於巢狀陣列S中。
Help filenameS=help('filename') 在Command window中顯示filename的輔助說明文字。傳回在filename的輔助說明文字到字元字串S中。
type filename 在Command window中顯示M-file。

上述的函式中大部份只需要部作的路徑資訊來找出特定檔案的位置。也就是,可以包括或不包括它的目錄路徑的一部份。如果在filename中沒有目錄路徑被包括,MATLAB搜尋路徑會使用目前的目錄來搜尋所需的檔案。如果已提供了部份的目錄路徑,MATLAB會巡迴MATLAB的搜尋路徑以找出子目錄和指定的檔案。例如,如果filename = 'mystuff/myfile',」MATLAB限制它的搜尋到MATLAB路徑上名為mystuff的子目錄。
為了說明上述函式的用途,考慮下面的函式mmbytes。


function y=mmbytes(arg)
%MMBYTES Variable Memory Usage. (MM)
% MMBYTES and MMBYTES('base') returns the total memory in bytes
% currently used in the base workspace.
% MMBYTES('caller') returns the total memory in bytes currently
% used in the workspace where MMBYTES is called from.
% MMBYTES('global') returns the total memory in bytes currently
% used in the global workspace.
if nargin==0
arg='base'
end
if strcmp(arg,'global')
x=evalin('base','whos(''global'')');
else
x=evalin(arg,'whos');
end
y=sum(cat(1,x.bytes));


此函式使用whos函式來收集關於存在於MATLAB內變數的資訊。Whos函式的輸出產生了一個結構陣列x。這個結構的bytes欄位包含了對所有變數的記憶體配置情形。在函式中最後的陳述式將所有已配置的記憶體數目連結為一向量,並以sum函式求得其總和。

因為它各式各樣的使用方式,函式exist並沒有列於上表中。此函式測試變數、檔案、目錄,等等...是否存在。以下是此函式的輔助說明文字,描述了它許多的用法。

>> help exist

EXIST Check if variables or functions are defined.
EXIST('A') returns:
0 if A does not exist
1 if A is a variable in the workspace
2 if A is an M-file on MATLAB's search path. It also returns 2 when
A is the full pathname to a file or when A is the name of an
ordinary file on MATLAB's search path
3 if A is a MEX-file on MATLAB's search path
4 if A is a MDL-file on MATLAB's search path
5 if A is a built-in MATLAB function
6 if A is a P-file on MATLAB's search path
7 if A is a directory
8 if A is a Java class

EXIST('A') or EXIST('A.EXT') returns 2 if a file named 'A' or 'A.EXT'
and the extension isn't a P or MEX function extension.

EXIST('A','var') checks only for variables.
EXIST('A','builtin') checks only for built-in functions.
EXIST('A','file') checks for files or directories.
EXIST('A','dir') checks only for directories.
EXIST('A','class') checks only for Java classes.

EXIST returns 0 if the specified instance isn't found.

為了能更方便地處理包含了目錄路徑和檔案名稱的字元字串,MATLAB提供數種有用的函式。這些函式被整理如下表。

函式 描述
addpath('dirname') 增加目錄dirname到MATLAB搜尋路徑中。
[path,name,ext]=...fileparts(filename) 傳回filename的路徑、名稱和附加檔名。
filesep 傳回此電腦平台的檔案分隔字元。檔案分隔符號是用來分隔目錄和檔案名稱的字元。例如,在PC上,檔案分隔符號是''。
fullfile(d1,d2,...,filename) 使用樹狀目錄的字串,d1,d2,....來傳回filename的完整路徑和檔案規格。
matlabroot 傳回包含MATLAB根目錄的字串。
mexext 傳回此平台下的MEX-file附加檔名。
pathsep 傳回此平台下的路徑分隔符號。路徑分隔符號是在MATLAB搜尋路徑上,用來分隔東西的字元。
prefdir 傳回此平台下MATLAB優先次序目錄。
rmpath('dirname') 從MATLAB的搜尋路徑中移除目錄dirname。
tempdir 傳回此平台下的暫時目錄名稱。
tempname 傳回此平台下的暫時檔案名稱。

這些函式,和上述表中的那些說明,使得建立檔案和目錄管理變得更加容易,就好像M-file一般。藉由查閱線上輔助說明,可以找到更多關於各個函式的輔助。

Comments