MATLAB n MAT MATLAB workspace load save CSV
MATLAB 之 程應用 高階的檔案讀寫指令 n 先列出常用讀寫檔案指令, 稍後將介紹用法 類別 一般資料 支援檔案格式 指令 MAT - MATLAB workspace load, save CSV - Comma separated numbers csvread, csvwrite DAT - Formatted text Importdata DLM - Delimited text dlmread, dlmwrite TAB - Tab separated text XLS - Excel worksheet Xlsread WK 1 - Lotus 123 worksheet wk 1 read, wk 1 write 試算表 3
MATLAB 之 程應用 高階的檔案讀寫指令(cont) 類別 支援檔案格式 指令 CDF - Common Data Format. FITS Flexible cdfread, cdfwrite Image Transport System Fitsread HDF - Hierarchical Data Format hdfread, hdfwrite 電影 AVI - Movie aviread 影像 TIFF, PNG, HDF, BMP, JPEG, GIF, PCX, XWD, CUR, ICO, RAS, PBM, PGM, PPM imread, imwrite AU, SND - Ne. XT/Sun sound auread, auwrite WAV - Microsoft Wave sound wavread, wavwrite 科學資料 音訊 4
MATLAB 之 程應用 csvread n n 使用 csvread 指令來讀取 條件: n n n 資料檔案是由逗號分開 只有包含數值資料 Ex: csvread 01. m fprintf('data. csv 的內容:n'); type data. csv % 列出 data. csv 的內容 A = csvread('data. csv') % 將 data. csv 的內容讀到矩陣 A 5
MATLAB 之 程應用 dlmread n n 如果數值資料的分界符號(Delimiters)不是 逗點,就不能使用 csvread 指令,而要改用 dlmread 指令 Ex: dlmread 01. m fprintf('data. dlm 的內容:n'); type data. dlm % 列出 data. dlm 的內容 A = dlmread('data. dlm', 't') % 將 data. dlm 的內容讀到矩陣 A 7
MATLAB 之 程應用 textread n n 如果檔案資料包含數值及字串,我們就必須 改用 textread 指令 Ex: textread 01. m fprintf('data. txt 的內容:n'); type data. txt % 列出 data. txt 的內容 [name, hobby, age] = textread('data. txt', '%s%s%d') 9
MATLAB 之 程應用 讀取文字檔 n n n textread 也可以讀取一個文字檔 同時把檔案內的每一列文字變成字串異質陣 列裡面的每一個元素 Ex: textread 03. m Contents = textread('textread 03. m', '%s', 'delimiter', 'n', 'whitespace', ''); class(contents) % 印出 contents 的資料類別 contents{1} % 列出 contents 第一列 contents{2} % 列出 contents 第二列 13
MATLAB 之 程應用 Result ans = cell ans = contents=textread('textread 03. m', '%s', 'delimiter', 'n', 'whitespace', ''); ans = class(contents) % 印出 contents 的資料類別 n n 上例使用 textread 讀入 textread 03. m(也就是此範 例檔案),並顯示此檔案的第一列和第二列。 textread 指令的用法還有很多,功能也很強大 n n 在MATLAB下輸入「help textread」 可以得到完整的技術支援。 14
MATLAB 之 程應用 Fileread n n 若只是要將一個檔案的內容送到一個字串, 可以使用 fileread 指令 Ex: 範例16 -6:fileread 01. m out = fileread(‘data 2. txt’); class(out) size(out) 15
MATLAB 之 程應用 Ex: fopen 01. m [fid, message] = fopen('no_such_file', 'r'); fprintf('fid = %dn', fid); fprintf('message = %sn', message); fid = -1 message = Sorry. No help in figuring out the problem. . . n n 上例可知當檔案不存在時,回傳的 fid 是 – 1 同時 message 會包含相關的錯誤資訊。 20
MATLAB 之 程應用 Ex: fopen 02. m n 若開啟成功,則傳回的 fid 是一個大於 2 的 整數,而且傳回的 message 是一個空字串, 例如: [fid, message] = fopen('fopen 02. m', 'r'); fprintf('fid = %dn', fid); fprintf('message = %sn', message); fid = 3 message = 21
MATLAB 之 程應用 應用: 模擬unix的grep指令 n grep : 用來找出包含某一特定字串的一列 function grep(filename, pattern) fid = fopen(filename, 'r'); line_number = 0; while feof(fid) == 0, line = fgetl(fid); matched = findstr(line, pattern); if ~isempty (matched) fprintf('%d: %s n', line_number, line); end line_number = line_number + 1; end fclose(fid); 27
MATLAB 之 程應用 result n 如欲列出 grep. m 中包含 'matched' 字串的每 一列,可輸入如下: >> grep('grep. m', 'matched') matched = findstr(line, pattern); if ~isempty (matched) 28
MATLAB 之 程應用 Ex: fscanf 01. m n 有一文字檔 test. txt 如下: 1 4 9 16 25 36 49 64 81 100 欲使用 fscanf 指令讀取其內容,可輸 入如下: n my. Data = 1 4 9 16 25 fid = fopen('test. txt', 'r'); 36 n my. Data = fscanf(fid, '%g'); 49 n fclose(fid); n my. Data n 64 81 % 顯示 my. Data 100 30
MATLAB 之 程應用 Ex: sscanf n n n sscanf 函數和 fscanf 的功能很類似 sscanf 函數從字串(strings)中讀取資料 ex:sscanf. m str = num 2 str([pi, sqrt(2), log 10(3)]) %建立一字串str retrieved = sscanf(str, ‘%g’) %擷取str中的double str = 3. 1416 1. 4142 0. 47712 retrieved = 3. 1416 1. 4142 0. 4771 31
MATLAB 之 程應用 Ex: fprintf 01. m n 將平方根表寫入檔案 x = 1: 10; y = [x; sqrt(x)]; fid = fopen('square. Root. Table. txt', 'w'); fprintf(fid, 'Table of square root: rn'); fprintf(fid, '%2. 0 f => %10. 6 frn', y); fclose(fid); dos('start square. Root. Table. txt'); % 開啟 square. Root. Table. txt 33
MATLAB 之 程應用 sprintf n n n sprintf 函數和 fprintf 函數的功能很類似 sprintf 將資料以字串形式傳回 Ex: >> str = sprintf('log(%f) = %en', 2, log(2)) str = log(2. 000000) = 6. 931472 e-001 35
MATLAB 之 程應用 暫存檔案 欲開啟一暫存檔案,可用 tempname,如下: >> filename = tempname n Result: n filename = C: DOCUME~1jangLOCALS~1Temptp 273132 37
MATLAB 之 程應用 應用: 產生暫存的 HTML 檔案 n n 以下利用 tempname 產生一個暫存的 HTML 檔案,然後再將此檔案顯示在瀏覽器。 Ex: write. HTML. m filename = [tempname, '. html']; fid = fopen(filename, 'w'); fprintf(fid, '<html><body>n'); fprintf(fid, 'This is a test homepage written by MATLAB!n'); fprintf(fid, '</body></html>'); fclose(fid); dos(['start ', filename]); % 啟動和. html 相連結的應用程式 39
MATLAB 之 程應用 網路檔案的讀取 n n MATLAB 也可以直接讀取網路上的檔案 通常採用 URL(Universal Resource Locator)的方式 來指定這些網路上的檔案: n 一般網頁: n n FTP n n http: //www. mathworks. com ftp: //ftp. mathworks. com/pub/pentium/Moler_1. txt 本機硬碟檔案: n file: ///C: winntmatlab. ini 41
MATLAB 之 程應用 urlread n Ex: urlread 01. m contents = urlread('http: //ecaaser 3. ecaa. ntu. edu. tw/ce a/cea 1. htm'); disp(contents); n n 上例中使用 urlread 指令來讀取筆者在台大生 機系的首頁 同時disp(); 將結果指定到字串變數 contents 42
MATLAB 之 程應用 urlwrite n n urlwrite可以直接在讀取網頁後,就儲存到本 機硬碟中 Ex: urlread 02. m temp. File = [tempname, '. html']; % 指定暫存檔案 urlwrite('http: //www. google. com. tw', temp. File); % 將網頁內容寫到檔案 dos(['start ', temp. File]); % 開啟此檔案 43
MATLAB 之 程應用 Ex: sendmail 01. m to = {'email 1@aaa. bbb. ccc', 'email 2@aaa. bbb. ccc'}; subject = 'Test email from a MATLAB program'; message = 'This is a test email sent via sendmail. '; attachment = {'c: windowsmatlab. ini'}; sendmail(to, subject, message, attachment); n 請將 to 的內容改為你自己本身的電子郵件, 並試著執行一次,以確認此程式碼的正確性。 46
MATLAB 之 程應用 Ex: fread 01. m fid = fopen('test 2. txt', 'r'); my. Data = fread(fid); char(my. Data') % 驗證所讀入的資料是否正確 fclose(fid); n Result: This is a test! n n char 可將 my. Data 的整數轉成 ASCII 字元 取 my. Data 的轉制是為了使印出的效果易於閱讀 49
MATLAB 之 程應用 Ex: fread 02. m n fread 函數可用第二個輸入引數來控制傳回矩 陣的大小 fid = fopen('test 2. txt', 'r'); my. Data = fread(fid, 4) % 只讀 4 個位元組 fclose(fid); my. Data = 84 105 115 50
MATLAB 之 程應用 Ex: fread 03. m fid = fopen('test 2. txt', 'r'); my. Data = fread(fid, [2 3]) fclose(fid); n Result: my. Data = 84 105 32 104 115 105 n 此時 my. Data 為 2 X 3 的矩陣。 n p. s. 上例中為長度 4的向量 51
MATLAB 之 程應用 Ex: fread 04. m fid = fopen('test 2. txt', 'r'); my. Data = fread(fid, 1, 'short') fclose(fid); my. Data 2 = bin 2 dec([dec 2 bin(abs('h'), 8), dec 2 bin(abs('T'), 8)]) n Result: my. Data = 26708 my. Data 2 = 26708 53
MATLAB 之 程應用 result A= 1 16 49 100 4 25 64 0 9 36 81 0 ans = 1 58
MATLAB 之 程應用 frewind n 從 test. txt 的起始位置讀出資料 n 用 frewind 來重設指標的位置: >> frewind(fid); >> A = fscanf(fid, '%g', 5) n Result: A= 1 4 9 16 25 59
MATLAB 之 程應用 ftell n n 傳回現在的指標位置 Ex: ftell 01. m fid = fopen('test. bin', 'w'); count = fwrite(fid, randperm(10), 'int 32'); ftell(fid) ans = 40 n 40 代表指標已在檔案結束位置。 61
- Slides: 66