MATLAB 程式設計入門篇 第十章:字元與字串 張智星 (Roger Jang) 台大資工系 多媒體檢索實驗室.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

第4章 VB.NET程式與 網頁製作的應用 主講人: 姚奉緒 M
MATLAB 程式設計 時間量測 清大資工系 多媒體資訊檢索實驗室.
第四章 陣列、字串與排序.
陣列與字串 Java陣列特性 一維陣列 多維陣列 字串 字串的相關函數 字串緩衝器類別.
JAVA 程式設計 資訊管理系 - 網路組.
File Access 井民全製作.
資料結構 第2章 陣列.
13 C++字串 字串與數值轉換函數 13.1 C++字串類別 建立C++字串 13-2
字元與字串 方煒 台大生機系.
C 程式設計— 字元與字串 台大資訊工程學系 資訊系統訓練班.
Visual C++ introduction
黃聰明 國立臺灣師範大學數學系 其它的資料型態與繪圖型態 黃聰明 國立臺灣師範大學數學系 T.-M.Huang.
張智星 清大資工系 多媒體檢索實驗室 MATLAB 程式設計入門篇 通用運算式 張智星 清大資工系.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 指定字串的初值 8-3 指標與字串 8-4 字串處理 8-5 C語言的字串函數.
列舉(enum).
String C語言-字串.
Matlab M檔案 方煒 台大生機系.
MATLAB 程式設計入門篇 與Excel試算表的整合
Java程式概觀.
C語言簡介 日期 : 2018/12/2.
第七章 字符串处理 7.1 字符阵列 7.2 字符串单元阵列 7.3 字符串比较 7.4 字符串搜索与取代 7.5 字符串与数值之间的变换
生物資訊程式語言應用 Part 3 Perl Language.
SQL Stored Procedure SQL 預存程序.
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
張智星 清大資工系 多媒體檢索實驗室 第九章: 矩陣的處理與運算 張智星 清大資工系 多媒體檢索實驗室.
Introduction to the C Programming Language
Ch10 字元與字串 物件導向程式設計(II).
雲端運算的基石(2) 虛擬化技術實作(XP篇─上)
Introduction to the C Programming Language
Java 程式設計 講師:FrankLin.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
Chap3 Linked List 鏈結串列.
第九章: 矩陣的處理與運算 張智星 (Roger Jang)
程式設計實習課(四) ----C 函數運用----
MATLAB 程式設計入門篇 初探MATLAB
第一單元 建立java 程式.
第三章 資料型態與輸出控制 本章學習目標 認識Matlab的基本資料型態 練習資料型態的轉換 學習如何控制Matlab的輸出格式
雲端計算.
JAVA 程式設計 資訊管理系 - 網路組.
輸入&輸出 函數 P20~P21.
張智星 (Roger Jang) 清大資工系 多媒體檢索實驗室
第九章 字串.
MATLAB 程式設計入門篇 初探MATLAB
第一次Labview就上手 參考書籍: LabVIEW for Everyone (Jeffrey Travis/Jim Kring)
張智星 清大資工系 多媒體檢索實驗室 Tree Net Construction 張智星 清大資工系.
異質陣列 (Cell Arrays) 方煒 台大生機系.
撰寫MATLAB基礎財務程式 柯婷瑱.
挑戰C++程式語言 ──第8章 進一步談字元與字串
張智星 (Roger Jang) 清大資工系 多媒體檢索實驗室
認識常數與變數 學習C++所提供的各種基本資料型態 瞭解溢位的發生 學習認識資料型態之間的轉換
C qsort.
挑戰C++程式語言 ──第7章 輸入與輸出.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
MiRanda Java Interface v1.0的使用方法
第14章 結構與其他資料形式.
陣列與結構.
10115: Automatic Editing ★★☆☆☆
第九章 布林代數與邏輯設計.
簡單Java介紹.
1757: Secret Chamber at Mount Rushmore
資料表示方法 資料儲存單位.
Programming & Language Telling the computer what to do
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
變數與資料型態  綠園.
Array(陣列) Anny
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
InputStreamReader Console Scanner
Presentation transcript:

MATLAB 程式設計入門篇 第十章:字元與字串 張智星 (Roger Jang) 台大資工系 多媒體檢索實驗室

本章簡介 本章介紹 MATLAB 用於處理字元 ( Characters )與字串( Strings )的指令及相 關資料型態。 MATLAB 處理字串的相關指令大 部分都放在下列目錄之中: {MATLAB 根目錄 }\toolbox\matlab\strfun 其中的「 strfun 」就是代表「 String Functions 」。若要查詢與字元和字串相關的指 令,可在 MATLAB 下輸入: help strfun help strings

10-1 字元與字串的基本概念 數個字元( Characters )可以構成一個 字串( Strings ) 一個字串是被視為一個列向量( Row Vector )進行儲存 此一字串中的每一字元(含空白字元), 是以其 ASCII 碼的形式存放於此列向量 中的每一個元素

字元與字串的基本概念 Matlab 用「單引號」來界定字串變數,多個字 串變數可直接並排,以得到一個新字串變數, 例如: 範例 10-2: string102.m str3 = I like MATLAB, JavaScript, and C++! str1 = 'I like MATLAB,';% 建立字串變數 str1 str2 = ' JavaScript, and C++!';% 建立字串變數 str2 str3 = [str1 str2]% 直接並排 str1 及 str2 ,以建立 str3

字元與字串的基本概念 欲輸入含有單引號的字串,可重覆單引號的使 用 若要計算字串變數的長度(即組成字元的個 數),可用 length 指令 範例 10-4: string104.m ans = 16 sentence = 'I''ve got a date!'; length(sentence)% 計算字串變數 sentence 的長度

字串和其 ASCII code double 指令 : 檢視字串變數的儲存內容(即 ASCII 內碼) char 指令 : 將 ASCII 內碼轉回字串形式 範例 10-6: string106.m sentence2 = I've got a date ! sentence = 'I''ve got a date!'; sentenceAscii = double(sentence); % 檢視 sentence 的 ASCII 碼 sentence2 = char(sentenceAscii)% 將 ASCII 碼轉回字串形式

Quiz Given the fact that abs( ' 1 ' ) is equal to 49, what is the value of z in the following script? Given the fact that abs( ' 1 ' ) is equal to 49 and z is [147, 167, 166] in the following script, what is the value of abs( ‘ a ' )? x = '123'; y = ‘325'; z=x+y; x = '123'; y = ‘bus'; z=x+y;

字元的儲存 無論是中文或英文,每一個字元都會佔用兩個位元組 ( 2 Bytes ),故在上頁中,字串變數 sentence 總共 由 16 個字元構成,佔用的記憶體總計為三十二個位元 組( 32 bytes ) whos 指令 : 檢視字串變數 sentence 所佔用儲存空間 MATLAB 是以兩個位元組來儲存一個字元,所以也可 以支援中文( MATLAB 內部都是以 unicode 來儲存), 而且 中文的 ASCII 內碼都會大於數字 128 由於 MATLAB 將字串以其相對應之 ASCII 內碼(即數 字形式)儲存成一列向量,故若對此字串直接進行數 值運算, MATLAB 會先將此字串轉成數值,再進行一 般數值向量的運算

字元與字串的基本概念 -eval eval 指令 : 直接 “ 執行 ” 某一特定字串,其效果就如同直接在 MATLAB 指 令視窗內輸入此一特定字串 eval 指令特別適用於在 for-loop 內自動產生有規律的變數名稱 範例 10-11: string111.m Name Size Bytes Class x3 3x3 72 double array x4 4x4 128 double array x5 5x5 200 double array x6 6x6 288 double array Grand total is 86 elements using 688 bytes x3, x4, x5, x6 都是在 for-loop 中產生的變數,分別代表維度為 3×3 、 4×4 、 5×5 、 6×6 的魔方陣 clear all % 清除所有變數 for i = 3:6 eval(['x', int2str(i), '= magic(', int2str(i), ') ; ']); end whos x*

字串的判斷 class 或 ischar 指令 : 判斷某一個變數是 否為字串 範例 10-12: string112.m 字串變數所佔用的空間是同長度雙精準 ( Double )數值變數的四分之一 chinese = ' 今日事,今日畢 '; out1 = class(chinese) % out1 的值是 “ char ” ,代表 chinese 是字串變數 x = chinese+1; out2 = ischar(x) % out2 的值是 0 ,代表 x 不是一個字串變數

10-2 一個變數來儲存多個字串 第一種方法是使用二維字元陣列( Two Dimensional Character Arrays ) 必須先確認每個字串(即每一橫列)的長度一 樣,否則就必須在短字串結尾補上空白字元 範例 10-13: string201.m departments = ee cs econ departments = ['ee '; 'cs '; 'econ']% 注意空白字元的使用

一個變數來儲存多個字串 用 char 指令儲存多個字串 得到結果和前一個範例依樣 ; 從二維字元陣列抽取出字串時,切記要使用 deblank 指令來移除尾部的空白字元 範例 10-15: string203.m. departments = char('ee', 'cs', 'econ')% 注意「 () 」及「, 」的使用 departments = char('ee', 'cs', 'econ'); dept1 = departments(1,:);% (1,:) 代表第一列的元素 dept2 = deblank(dept1);% 使用 deblank 指令來移除尾部的空白字元 len1 = length(dept1)% 顯示變數 dept1 的長度 =4 len2 = length(dept2)% 顯示變數 dept2 的長度 =2

一個變數來儲存多個字串 當字串的長度差異甚大,那麼使用二維字元陣 列來儲存多個字串,將造成記憶體空間的浪費, 怎麼辦 ? 「異質陣列」 : 使用大括號框住多個字串, 或用 cellstr 指令將字元陣列轉換成異質陣列 (string204.m,string205.m) 若要將包含字串的異質陣列轉換成一般的二維 字元陣列,還是可以使用 char 指令

10-3 字串的比較、尋找、 代換、分解與結合 strcmp 指令 : 用於比較字串內容的異同 範例 10-19: string301.m 不相等回傳 0 ,相等回傳 1 ,和 C 程式 語言的 strcmp() 函數剛好相反,要特別注 意! str1 = 'today'; str2 = 'tomorrow'; str3 = 'today'; out1 = strcmp(str1, str2)% 比較兩字串 str1 和 str2 = 0 out2 = strcmp(str1, str3)% 比較兩字串 str1 和 str3 = 1

字串的比較和尋找 strcmpi: 不分大小寫的字串比對 strncmp: 比較字串的前 n 個字元 strcmp 及 strncmp 指令亦可用於字串異 質陣列 findstr: 尋找在某一個長字串中的子字串 ( Substrings ),並傳回其起始位置 strrep: 字串尋找及代換, 例如 : newString = strrep(string, pattern, pattern2)

字串的分解 strtok 指令 : 根據一給定的分界字元( Delimiting Characters ),將一字 串拆解成數個字串,預設分界字元為空白字元 strvcat 指令 : 將拆解下來的字串內容(即儲存在字串變數 chopped 中) 加到二維字元陣列 parsed 中 範例 10-24: string306.m parsed = ee cs econ stat me input_string = 'ee cs econ stat me'; remainder = input_string; parsed = '';% 建立一空字元陣列 while (any(remainder)) [chopped, remainder] = strtok(remainder); parsed = strvcat(parsed, chopped); end parsed

字串的結合 MATLAB 在讀入中文字串時,將每一個中文字的 2- byte 分開來讀,造成兩個中文字變成四個字串元素 native2unicode 可將中文的 2-byte 「結合」在一起 範例 10-27: string309.m line2 = 我是 Roger ans = 7 (註:這個中文讀取問題在 MATLAB7.2 版之後,已經解決了!) fid = fopen('big5.txt'); line = fgetl(fid); % 讀取一列檔案內容 fclose(fid); line2 = native2unicode(line, 'big5') % 將被拆開的中文字結合在一起 leng = length(line2) % 顯示字串長度

10-4 字串、數值與陣列的轉換 int2str 指令 : 將整數型態的資料轉換成字 串資料 例如 :y = int2str(x) , x 為整數, y 為字串 num2str 指令 : 將實數轉為字串 dec2hex 指令 : 將 10 進位數值資料轉換 成 16 進位的字串表示法 更多類似指令如 : hex2num, hex2dec, bin2dec….

字串陣列的轉換 mat2str 指令可將矩陣轉換為字串,此字串若 再經由 eval 指令,可再變回原先的矩陣 範例 10-32: string405.m B = [1 2 1;3 5 6] ans = 1 A = [1 2 1; ]; B = mat2str(A)% 將矩陣 A 轉成字串 B A2 = eval(B)% 再將字串 B 轉回矩陣 A2 isequal(A, A2)% 測試 A 和 A2 是否相等

字串與數值的結合 sprintf 指令 : 結合數值或字串,以產生新字串 (%s- 印 出字串, %g- 印出數值,可使用 %f 或加上控制印出 位數大小的數字 ) 範例 10-33: string406.m newString = 「圓周率」是 sscanf 可依給定的格式來解析出所要的字串或數值 範例 10-34: string407.m mat = str = ' 圓周率 '; newString = sprintf(' 「 %s 」是 %g', str, pi) str = ' '; mat = sscanf(str, '%f')