MATLAB 程式設計/從檔案讀取和寫入資料的基本操作
MATLAB 檔案型別
[edit | edit source]MATLAB 使用兩種檔案型別,分別是 .m 和 .mat 檔案
- .m / .mat 檔案:標準 MATLAB 檔案(.mat 中的大多數函式可以被舊版本的 MATLAB 支援)
- .mlx 檔案:即時程式碼檔案格式。這種格式是在 MATLAB 版本 R2016a 中引入的。這種型別的檔案儲存使用即時程式碼檔案格式的即時指令碼/即時函式。
匯入函式
[edit | edit source]通常用於將資料匯入 MATLAB 的函式是:importdata(filename)
importdata(filename) 可以將資料載入到陣列中。
% sample script of loading an images
>> A = importdata('example1.png');
imread(A)
載入資料
[edit | edit source]
load(filename) 可以從 filename 載入資料。這些檔案可以是文字、影像,甚至音訊檔案。
% sample script of loading an audio
>> B = load('example2.mp3');
audioread(B,single,1.0)
load 命令用於將資料從檔案載入到當前工作空間。
- 將檔案 mySave.mat 中的所有變數載入到當前工作空間。
>> load('mySave.mat')
>> load(fullfile(pwd, 'mySave.mat'))
- 僅載入變數 myData1 和 myData2。
>> load('mySave.mat', 'myData1', 'myData2')
- 載入所有 myData 變數。
>> load('mySave.mat', 'myData*')
- 獲取儲存檔案中變數的單元格陣列。
>> whos('-file', 'mySave.mat')
儲存資料
[edit | edit source]save 命令用於將工作空間資料儲存到檔案。
- 將所有工作空間資料儲存到當前目錄下的檔案 mySave.mat 中。
>> save('mySave.mat')
>> save(fullfile(pwd, 'mySave.mat'))
- 僅將變數 myData1 和 myData2 儲存到 mySave.mat 中。
>> save('mySave.mat', 'myData1', 'myData2')
- 將所有 myData 變數儲存到 mySave.mat 中。
>> save('mySave.mat', 'myData*')
- 將所有 myData 變數儲存到與 MATLAB 版本 6 相容的檔案 mySave.mat 中。
>> save('mySave.mat', 'myData*', '-v6')
- 將所有 myData 變數儲存到 ASCII 檔案中。
>> save('mySave.mat', 'myData*', '-ASCII')
- 將新變數追加到資料檔案。
>> save('mySave.mat', 'newData*', '-append')
Excel 電子表格 I/O
[edit | edit source]由於資料分析是使用輸入輸出的最常見動機之一,因此我將從讀取和寫入電子表格開始。我首先介紹命令列,因為它通常需要在評估 m 函式時匯入資料。
讀取 Excel 電子表格
[edit | edit source]MATLAB 使讀取 Excel 電子表格變得容易。它具有內建的命令 readcell
假設您有一個 Excel 檔案(最好是最新版本,檔案格式為 .xlsx),在這個例子中,您有一個包含如下所示資料的表格,儲存在名為 Class Marks.xlsx 的任何位置。
| 姓名 | 分數 |
| Ali | 93 |
| Chin | 47 |
| Sammy | 74 |
| Dorothy | 96 |
| Huat | 94 |
| Anna | 38 |
要讀取內容,您需要鍵入如下程式碼
A=readcell('C:\mydir\Class Marks.xlsx') % mydir is referring where you actually saves the Excel file
專業提示:如果您不確定檔案的位置,右鍵單擊您儲存的檔案並選擇屬性,然後在常規選項卡中查詢位置。您可以將 mydir 更改為您選擇的位置
它將顯示如下輸出
A =
7×2 cell array
{'Name' } {'Marks'}
{'Ali' } {[ 93]}
{'Chin' } {[ 47]}
{'Sammy' } {[ 74]}
{'Dorothy'} {[ 96]}
{'Huat' } {[ 94]}
{'Anna' } {[ 38]}
這行程式碼從 Class Marks.xlsx(從儲存的目錄 - mydir)中讀取,並將它放置到 MATLAB 中名為 A 的相同陣列中。然後,您可以以任何您想要的方式運算元組 A。
從文字檔案中的特定範圍讀取
[edit | edit source]從上面的表格中,我們擴充套件到更多行和列,如下面的名為 Class1A 的工作表所示。請注意 A-> H 和 1->11 是用於參考的。
在這個例子中,我們感興趣的是 Huat 的分數,並建立一個名為 B 的陣列來提取他的分數。
| A | B | C | D | E | F | G | H | |
|---|---|---|---|---|---|---|---|---|
| 1 | 姓名 | 英語 | 數學 | 科學 | 藝術 | 音樂 | 馬來語 | 道德 |
| 2 | Ali | 71 | 54 | 65 | 27 | 65 | 54 | 96 |
| 3 | Chan | 14 | 96 | 50 | 40 | 17 | 99 | 95 |
| 4 | Sammy | 17 | 15 | 72 | 24 | 55 | 15 | 26 |
| 5 | Dorothy | 89 | 35 | 45 | 14 | 87 | 52 | 65 |
| 6 | Huat | 82 | 90 | 15 | 65 | 42 | 82 | 90 |
| 7 | Anna | 12 | 77 | 25 | 63 | 46 | 14 | 31 |
| 8 | Lee | 77 | 22 | 49 | 91 | 43 | 89 | 66 |
| 9 | Muthu | 61 | 25 | 38 | 65 | 43 | 35 | 89 |
| 10 | Ismail | 70 | 70 | 79 | 75 | 81 | 44 | 98 |
| 11 | Th'ng | 42 | 92 | 99 | 14 | 46 | 12 | 24 |
註釋解釋瞭如何選擇特定範圍的所需資料。
B=readcell('C:\mydir\Class Marks.xlsx','Sheet','Class1A','Range','A6:H6')
%mydir is the location where Excel is stored
%sheet is to select which sheet
%range can be selected with following manner
%a. form 'A1' (cell)
%b. form 'A:B' (column-select)
%c. form '1:5'(row-select)
%d. form 'A1:B5' (rectangle-select)
陣列 B 將顯示以下結果
B =
1×8 cell array
{'Huat'} {[82]} {[90]} {[15]} {[65]} {[42]} {[82]} {[90]}
寫入 Excel 電子表格
[edit | edit source]writecell 命令允許將資料新增到 Excel 檔案中。
首先,我們建立學生 Juan 的資料,如下所示
B = {'Juan' , 43,67,88,45,35,92,65} % create a row matrix
B =
1×8 cell array
{'Juan'} {[43]} {[67]} {[88]} {[45]} {[35]} {[92]} {[65]}
稍後,使用 **writecell** 命令(確保 Excel 檔案已關閉以防止出現錯誤訊息)
Error using writecell (line 149) Unable to write to file 'C:\mydir\Class Marks.xlsx'. You may not have write permissions or the file may be open by another application.
writecell(B,'C:\mydir\Class Marks.xlsx','Sheet','Class1A','Range','A12');
%mydir is location where the excel file is located
%sheet is Class1A
%range is starting cell where to paste the data
當您重新開啟 Excel 檔案時:您應該會看到 Juan 及其分數
| A | B | C | D | E | F | G | H | |
|---|---|---|---|---|---|---|---|---|
| 1 | 姓名 | 英語 | 數學 | 科學 | 藝術 | 音樂 | 馬來語 | 道德 |
| 2 | Ali | 71 | 54 | 65 | 27 | 65 | 54 | 96 |
| 3 | Chan | 14 | 96 | 50 | 40 | 17 | 99 | 95 |
| 4 | Sammy | 17 | 15 | 72 | 24 | 55 | 15 | 26 |
| 5 | Dorothy | 89 | 35 | 45 | 14 | 87 | 52 | 65 |
| 6 | Huat | 82 | 90 | 15 | 65 | 42 | 82 | 90 |
| 7 | Anna | 12 | 77 | 25 | 63 | 46 | 14 | 31 |
| 8 | Lee | 77 | 22 | 49 | 91 | 43 | 89 | 66 |
| 9 | Muthu | 61 | 25 | 38 | 65 | 43 | 35 | 89 |
| 10 | Ismail | 70 | 70 | 79 | 75 | 81 | 44 | 98 |
| 11 | Th'ng | 42 | 92 | 99 | 14 | 46 | 12 | 24 |
| 12 | Juan | 43 | 67 | 88 | 45 | 35 | 92 | 65 |
如果檔案不是 Excel 電子表格,則仍然可以使用“load”函式讀取它
>> load newfile.txt
這隻適用於文字完全是數字的,沒有特殊格式。否則,您會收到“無法識別的字元”錯誤。
寫入非 Excel 檔案或使用 MATLAB 6.5 或更低版本的最快捷方法是使用與寫入 Excel 檔案相同的程式碼,但更改副檔名。通常,純文字檔案不會出現格式問題。
為了讀取更通用的文字檔案,MATLAB 沒有一個函式可以輕鬆完成(除非您有 Excel),但您可以使用 MATLAB 檔案交換中的“textread.m”函式讀取非常通用的文字檔案(對單元格和單元格內文字使用不同的分隔符)(進行谷歌搜尋以找到它)。您也可以嘗試使用 fscanf,如果格式一致性足夠高(即空格數量一致、列中沒有字串和數字混合等)。
MATLAB 包含一個很好的 GUI 應用程式,它將引導您從任何識別的資料檔案(通常在 Windows 系統上是 .mat、.txt 或 .xls)匯入資料。要使用它,請轉到檔案 > 匯入資料,並選擇您要匯入的檔案。然後,選擇存在什麼列分隔符(透過選擇適當的單選按鈕)。最後,單擊“下一步”。
MATLAB 以類似於檔名但經過修改以符合 MATLAB 語法的名稱儲存變數。空格被省略,加號和減號被轉換成其他字元。要檢視 MATLAB 生成的名稱(並可能更改它),請在命令提示符中鍵入“who”。