lecture4符串元胞數(shù)組結(jié)構(gòu)數(shù)組_第1頁
lecture4符串元胞數(shù)組結(jié)構(gòu)數(shù)組_第2頁
lecture4符串元胞數(shù)組結(jié)構(gòu)數(shù)組_第3頁
lecture4符串元胞數(shù)組結(jié)構(gòu)數(shù)組_第4頁
lecture4符串元胞數(shù)組結(jié)構(gòu)數(shù)組_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、2.5 字符串2.5.1 字符串的定義 (可通過help strings了解本小節(jié)內(nèi)容)另一種常用的變量類型為字符串(字符型數(shù)組)。matlab中的字符串常量是由單引號括起來的。例如:stra=guowang mustrb=hebei university of technology以單引號括起來的字符串實際上是一個行向量(字符型數(shù)組)。其每個元素是一個字符,在內(nèi)存中實際存儲的是其ascii碼值,元素的標(biāo)識方法和數(shù)值向量相同。例如:stra(1:7) , stra(9:end), stra works in strb . 注:stra; strb 出錯,大家想一下這是為什么?2.5.2 常用的

2、字符串函數(shù)在strfun函數(shù)庫中提供了一系列關(guān)于字符串的函數(shù),可以通過help strfun命令查看有關(guān)信息。1. 獲取字符串的基本信息disp(x) 或display(x) 顯示變量x的內(nèi)容class(x) 以字符串的形式返回變量x的類型名例如:若stra是一個字符串,則class(stra)的值為charischar(x) 如果x是一個字符串,則返回1,否則返回0length(x) 若x為字符串,返回x的長度isletter(x) 逐個檢查x的每個元素是否為字母,如果是則返回1,否則返回0 ,最后返回一個和x同樣大小的邏輯數(shù)組。 isspace(x) 逐個檢查x的每個元素是否為空格,如果是

3、則返回1,否則返回0 ,最后返回一個和x同樣大小的邏輯數(shù)組。 例如: 在命令窗口中輸入以下命令,觀察執(zhí)行結(jié)果stra=guowang mudisp(stra), class(stra), ischar(stra), length(stra)isletter(stra)ispace(stra)2. 字符串的基本操作-連接、查找和替換strcat(s1,s2,sn) 連接字符串s1,s2,sn,得到一個新的字符串strvcat(t1,t2,tn) 垂直連接字符串t1,t2,tn,得到一個字符串矩陣(多行字符串)str2mat(t1,t2,tn) 和strvcat(t1,t2,tn) 基本一樣str

4、match(s1,s2) 逐行搜索字符串矩陣s2 ,給出以s1 開頭的那些行的行號findstr(s1,s2) 查找s1在s2 中出現(xiàn)的位置(如果s1短),或者s2在s1 中出現(xiàn)的位置(如果s2短)。strfind (s1,s2) 在s1中查找s2出現(xiàn)的位置。strrep(s1,s2,s3) 把字符串s1的所有出現(xiàn)s2的地方替換為s3strtok(s) 查找字符串s的第一個間隔符(空格符、制表符、回車符)前的內(nèi)容blanks(n) 生成含有n個空格的字符串deblank(s) 返回刪除字符串s尾部空格得到的字符串例 在命令窗口中輸入以下語句,觀察并分析執(zhí)行結(jié)果stra= i love matl

5、ab.; strb= he loves matlab.;strc= i love math.;str=stra blanks(4) strb blanks(4) strc blanks(4)str2=deblank(str)s1=strcat(stra,strb,strc)s2=strvcat(stra,strb,strc)strmatch(i, s2)p=findstr(s1, love)q=findstr(s1, ok)s3=strrep(s1, i , we )token=strtok(this is a example.)3.字符串比較函數(shù)格式:strcmp(s1,s2) 功能:比較字

6、符串s1和s2是否相等。如果相同則返回1,否則返回0格式:strcmpi(s1,s2) 功能:在忽略字母大小寫的情況下,比較字符串s1和s2是否相等。如果相同則返回1,否則返回0格式:strncmp(s1,s2,n) 功能:比較兩個字符串s1和s2的前n個字符是否相等。如果相同則返回1,否則返回0格式:strncmpi(s1,s2,n) 功能:在忽略字母大小寫的情況下,比較字符串s1和s2的前n個字符是否相等。如果相同則返回1,否則返回0字符串比較的例子例 在命令窗口中輸入以下語句,觀察并分析執(zhí)行結(jié)果str1=hello; str2= hello; str3=hello ;strcmp(str

7、1,str2),strcmp(str1,str3)strcmpi(str1,str2),strcmpi(str1,str3)strncmp(str1,str2,5),strncmp(str1,str3,5)strncmpi(str1,str2,5),strncmpi(str1,str3,5)4. 字符串轉(zhuǎn)換函數(shù)字符串轉(zhuǎn)換函數(shù)主要有三類:大小寫轉(zhuǎn)換、ascii碼與字符串之間的轉(zhuǎn)換、數(shù)值(或數(shù)值數(shù)組)與字符串的轉(zhuǎn)換。常用的字符串轉(zhuǎn)換函數(shù)upper(a) 把字符串a(chǎn)中的所有小寫字母轉(zhuǎn)換為相應(yīng)的大寫字母lower(a) 把字符串a(chǎn)中的所有大寫字母轉(zhuǎn)換為相應(yīng)的小寫字母double(x) 將字符串x轉(zhuǎn)換為

8、double型數(shù)組(將每個字符的ascii碼作為數(shù)值型數(shù)組的一個元素)char(x) 將ascii碼x轉(zhuǎn)換為字符串例: double(abc)為97 98 99,char(97 98 99)為字符串a(chǎn)bc; double(123)為49 50 51,char(49 50 51)為字符串123int2str(x) 將整數(shù)x轉(zhuǎn)換為字符串num2str(x) 將數(shù)值x轉(zhuǎn)換為字符串str=mat2str(mat) 將數(shù)值矩陣mat轉(zhuǎn)換為字符串形式,使得由eval(str)可以得到原矩陣mateval(expstr) 執(zhí)行字符串expstr(執(zhí)行由字符串expstr描述的命令或求由字符串expstr確定

9、的表達(dá)式的值)。例:x=10; s1=int2str(x) 為10f=10.2; s2=num2str(f)為10.2a=1 2 3; 4 5 6; s3=mat2str(a)為1 2 3;4 5 6b=eval(s3)則得到和a完全相同的矩陣b另外,執(zhí)行strmat=int2str(a)或strmat=num2str(a)的結(jié)果是什么?sprintf函數(shù)還有一個特別有用的生成字符串的函數(shù):sprintf格式:s,errmsg = sprintf(format,data1,.,datan)功能:按第一個輸入?yún)?shù)format指定的格式,輸出變量data1,.,datan,將輸出的內(nèi)容作為字符串s

10、。第二個輸出參數(shù)errmsg是出錯信息,可以省略。例: str=sprintf(the value of pi = %8.6f,pi)執(zhí)行后,str的值為the value of pi = 3.141593例: name=zhang san;sex=male; age=50;record=sprintf(name=%s, sex=%s, age=%d,name,se,age)還有一個和sprintf相對應(yīng)的、與字符串有關(guān)的函數(shù)sscanfsprintf將變量輸出到字符串,而sscanf將字符串作為輸入字符串應(yīng)用舉例基于圖像的性別、年齡、人臉識別需要采集許多不同年齡、性別的人的圖像用于訓(xùn)練和測試

11、對于每幅圖像,要輸入人的姓名(name,字符串)、性別(sex=m或f)、年齡(age)等信息假設(shè)相應(yīng)的圖像文件名(filename)的命名規(guī)則為:姓名_性別_年齡.jpg例如:當(dāng)name=zhang,sex=m,age=20時,相應(yīng)的filename=zhang_m_20,jpg問題:對于任意name(姓名),sex(性別),age(年齡) ,自動得到正確的文件名filename方法1. filename1=name _ sex _ num2str(age) .jpg方法2. filename2=sprintf(%s_%s_%d.jpg,name,sex,age)strcmp(filenam

12、e1, filename2)思考題1:如何判斷字符串filename是否為jpg文件的文件名思考題2:對于上述例子,如何由文件名filename,得到name(姓名),sex(性別),age(年齡)等的值?與字符串有關(guān)的常用函數(shù)(小結(jié))獲取字符串的基本信息、基本操作(連接、查找、替換等)、字符串比較、字符串轉(zhuǎn)換(大小寫、字符與ascii碼、數(shù)值與字符串等)一定要記住help strfun某個函數(shù)的使用方法:help 函數(shù)名2.6 元胞數(shù)組(cell array)普通的數(shù)組:每個數(shù)組元素的數(shù)據(jù)類型、長度都必須相同matlab從5.0版開始引入了一種嶄新的數(shù)據(jù)類型元胞數(shù)組,允許在一個數(shù)組中存放各種

13、不同類型的數(shù)據(jù)。元胞數(shù)組由規(guī)則排列的元胞組成(類似于普通數(shù)組和數(shù)組元素的關(guān)系),其中不同的元胞通過下標(biāo)來區(qū)分。和普通數(shù)組不同的是:在一個元胞數(shù)組的不同的元胞中可以存放不同類型、不同長度的數(shù)據(jù)。類似于超市中的物品寄存柜,由整齊地排列成若干行若干列的小格子(單元)組成,每個格子被編號, 每個格子中可以存放任意類型、大小的物品。元胞數(shù)組物品寄存柜;元胞-存放物品的格子(單元)2.6.1 元胞數(shù)組的建立與顯示1. 直接輸入整個元胞數(shù)組例:s=north,east, south, westa=this is the first example,hadamard(2);ones(3), s 或a=this

14、 is the first example,hadamard(2);ones(3), north,east, south, west例:顯示元胞數(shù)組a中各個元胞的結(jié)構(gòu)和內(nèi)容顯示元胞的結(jié)構(gòu)(格子物品)a(1,1),a(1,2),a(2,1),a(2,2)或a(1),a(3),a(2),a(4)顯示元胞中的內(nèi)容(物品) a1,1,a1,2,a2,1,a2,2或a1,a3,a2,a4. 元胞與元胞中內(nèi)容的標(biāo)識與顯示與數(shù)值數(shù)組一樣,元胞數(shù)組的維數(shù)不受限制,可以是一維、二維或更高維。元胞數(shù)組對元胞的編址方法也有單下標(biāo)編址和全下標(biāo)編址兩種。在元胞數(shù)組中,“元胞(元胞數(shù)組的元素)”和“元胞中的內(nèi)容”是兩個不

15、同范疇的東西。以二維元胞數(shù)組a為例,a(1,2)是指元胞數(shù)組a 中第行第列的元胞元素(格子及格子中存放的物品),而a1,2是指元胞數(shù)組a 中第行第列元胞中的內(nèi)容(格子中存放的物品)。元胞數(shù)組的顯示函數(shù)格式:celldisp(c)功能:顯示元胞數(shù)組的所有元素的內(nèi)容格式:cellplot(c)功能:以嵌套的格子的形式顯示元胞數(shù)組的所有元素的結(jié)構(gòu)例:設(shè)a是前面例子中創(chuàng)建的元胞數(shù)組,在命令窗口輸入以下命令,觀察執(zhí)行結(jié)果celldisp(a)cellplot(a) 3. 通過元素賦值法創(chuàng)建元胞數(shù)組例1 一維元胞數(shù)組的建立cleara1=this is the first string;a2=this i

16、s the second string;a3=rand(3);也可以采用下面的形式:cleara(1)=this is the first string;a(2)=this is the second string;a(3)=rand(3);例2 二維元胞數(shù)組的建立與顯示clears=first line, second line, third linea1,1=this is a example;a1,2=char(first line, second line, third line);a1,3=s;a2,1=magic(3);a2,2=zeros(2,3,4);a2,3=ok;celld

17、isp(a)cellplot(a)也可以采用下面的形式:clears=first line, second line, third linea(1,1)=this is a example;a(1,2)=char(first line, second line, third line);a(1,3)=s;a(2,1)=magic(3);a(2,2)=zeros(2,3,4);a(2,3)=ok;celldisp(a)cellplot(a)4. cell函數(shù)建議:先用cell函數(shù)創(chuàng)建空的元胞數(shù)組,然后再對元胞元素的元素賦值。格式:a=cell(n)功能:創(chuàng)建空的nxn的元胞數(shù)組格式:a=cell

18、(m,n)或a=cell(m,n)功能:創(chuàng)建空的mxn的元胞數(shù)組例如:clear;a=cell(1,3);a1=first; a2=second;a3=3+4i -5;-10i 3-4i;例clears=first line, second line, third linea=cell(2,3);a1,1=this is a example;a1,2=char(first line, second line, third line);a1,3=s;a2,1=magic(3);a2,2=zeros(2,3,4);a2,3=ok;celldisp(a)cellplot(a)2.6.2 元胞數(shù)組內(nèi)容

19、的調(diào)取前面已經(jīng)講過,圓括號用于尋訪元胞數(shù)組的元素(方格+內(nèi)容),而花括號用于尋訪元胞的內(nèi)容(方格中的內(nèi)容)。圓括號元胞外標(biāo)識(cell indexing) 花括號元胞內(nèi)編址(content addressing)本節(jié)將更詳細(xì)地講述調(diào)取元胞數(shù)組內(nèi)容的方法。(3) 調(diào)取一個元胞內(nèi)部的信息a21=a2,1 , a21(1,:), a21(2,:)或a2,1(1,:), a2,1(2,:)a22=a2,2, a22(1,2),a22(4),a22(1 4 7)或a2,2(1,2),a2,2(4) ,a2,2(1 4 7) a12=a1,2, a121, a122, a123 或a1,21, a1,22

20、, a1,23(4) 子元胞數(shù)組(注意:應(yīng)該用圓括號)b1=a(1,:) ,b2=a(:,2), b3=a(:,1:2), b4=a(1 3 5)b5=a1,2(1:2)(5) 同時調(diào)取多個內(nèi)容comma separated list expansion例:a1 3 5 %等價于a1,a3,a5a: %等價于a1,a2,a6 f1,f2,f3=deal(a1 3 5) %等價于f1=a1,f2=a3,f3=a5x=cell(1,6); %x:等價于x1,x2,xendx: =deal(a:)%等價于x1=a1,x2=a2,xend=aend說明:deal函數(shù)把輸入?yún)?shù)逐個分配給輸出參數(shù)??捎胔

21、elp deal命令查看其詳細(xì)用法。例創(chuàng)建一個2x3的元胞數(shù)組,然后調(diào)取其元素a=this is a example, first line, second line, third line, zeros(2,3,4); char(first line, second line, third line), magic(3), okcelldisp(a)(1) 調(diào)取一個元胞c11=a(1,1),c13=a(1,3)class(c11),class(c13)(2) 調(diào)取一個元胞的內(nèi)容a11=a1,1,a13=a1,3class(a11),class(a13)2.6.3 元胞數(shù)組的擴(kuò)展、收縮和重組元

22、胞數(shù)組的擴(kuò)展、收縮和重組的方法大致與數(shù)值數(shù)組情況相同。以下通過一些例子來說明。例1 元胞數(shù)組的擴(kuò)展a= a1,1 is a string 1+2i ; magic(3) north, eastc=cell(2); %預(yù)設(shè)c為2x2的空元胞數(shù)組c(:,1)=char(another, text string); 10:-1:1%對第1列元胞賦值,注意:左邊用圓括號。a3,2=5 %將a擴(kuò)展為3x2的元胞數(shù)組后對a3,2賦值c(3,:)=1 2 %將c擴(kuò)展為3x2的元胞數(shù)組后對c的第3行元胞賦值ac=a c %空格:用來分隔列;水平方向擴(kuò)展%等價于cat(2,a,c)或horzcat(a,c)ce

23、llplot(ac,legend)a_c=a;c %分號:用來分隔行;垂直方向擴(kuò)展%等價于cat(1,a,c)或vertcat(a,c)cellplot(a_c,legend)例2 元胞數(shù)組的收縮和重組1) 刪除整行或整列ac(3,:)= %刪除ac的第3行,使ac成為2x4 的元胞數(shù)組ac(:,4)= %再刪除ac的第4列,使ac成為2x3 的元胞數(shù)組2) 重組rac1=reshape(ac,3,2)rac2=reshape(ac,1,6)rac3=ac(:)3)刪除一個或幾個元胞ac(4)= %刪除ac中序號為4的元胞,ac變成1x5的元胞數(shù)組rac3(1 4 5)= %刪除rac3中的第

24、1,4,5個元胞, rac3變成3x1的元胞數(shù)組2.6.4 獲取元胞數(shù)組的信息class(c) 返回變量c的類型,若c是元胞數(shù)組,則返回celliscell(c) 判斷變量c是否為元胞數(shù)組,若是返回1,否則返回0ndims(c) 返回元胞數(shù)組c的維數(shù)s=size(c) 或m,n=size(c) 返回元胞數(shù)組c各維的大小m=size(c,1) 返回元胞數(shù)組c的行數(shù)n=size(c,2) 返回元胞數(shù)組c的列數(shù)numel(c) 返回元胞數(shù)組c中元胞的個數(shù)length(c) 等于 max(size(c), 若c只有1行或1列元胞,則length(c)等于numel(c)cellfun函數(shù)格式: a =

25、 cellfun(fun, c) 功能:將由fun指定的函數(shù)作用于元胞數(shù)組c的每一個元胞,將結(jié)果返回到a中。a的維數(shù)、大小與c相同。若c是一行或一列,則a(i)=fun(ci);若c是二維的,則a(i,j)=fun(ci,j)。當(dāng)fun為字符串isreal, isempty , islogical, length , ndims或prodofsize之一時,意義如表2-16所示。關(guān)于cellfun的更詳盡的使用說明請查看matlab的幫助文件。2.6.5 元胞數(shù)組轉(zhuǎn)換函數(shù)格式:c=num2cell(x)功能:將數(shù)值數(shù)組x轉(zhuǎn)換為維數(shù)、大小相同的元胞數(shù)組c例:x=1 2 3;4 5 6; c=nu

26、m2cell(x)等價于 c=1 2 3;4 5 6格式:c=mat2cell(x,m,n)功能:將矩陣x分塊后存儲轉(zhuǎn)換為元胞數(shù)組c,m,n一般為向量, m,n的元素決定了矩陣的分塊情況。例:在命令行輸入x=1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15, c=mat2cell(x,2 1, 2 3) 觀察并分析執(zhí)行結(jié)果。格式:m=cell2mat(c)功能:把合適的元胞數(shù)組轉(zhuǎn)換為矩陣?yán)?:c = 1 2 3 4; 5; 9 6 7 8; 10 11 12;m = cell2mat(c)例2:clear;x=reshape(1:20,4,5);c=mat2cell(

27、x,2 2,3,2)d=cell2mat(c(1,:)說明: 關(guān)于num2cell,mat2cell的其它調(diào)用格式請看matlab的幫助文件。2.7 架構(gòu)數(shù)組與元胞數(shù)組一樣,架構(gòu)數(shù)組(struct array)也能在一個數(shù)組里存放各種不同類型的數(shù)據(jù)。類似于c語言中的結(jié)構(gòu)型數(shù)組,但組織數(shù)據(jù)的能力比c語言中的結(jié)構(gòu)型數(shù)組更強、 更靈活、更富于變化。架構(gòu)數(shù)組的每個元素(element)是一個架構(gòu)(structure),數(shù)組中的每個架構(gòu)是平等的,它們以下標(biāo)來區(qū)分。每個架構(gòu)(架構(gòu)數(shù)組的元素)由若干個“域” (field) 組成,每個域必須有自己的名字,叫做域名(field name);域的取值叫做域值(f

28、ield value).在實際應(yīng)用中,部分域值可以不賦值。架構(gòu)的域中可以存儲任意類型、長度的數(shù)據(jù),例如:可以是數(shù)值型數(shù)組、邏輯型數(shù)組、字符串、元胞數(shù)組等。而且,架構(gòu)的域中還可以存放一個架構(gòu)型數(shù)組(架構(gòu)的嵌套使用)。和其它高級語言不同,一個架構(gòu)數(shù)組中不同架構(gòu)的同名域中可以存儲不同類型的數(shù)據(jù)。與數(shù)值數(shù)組一樣,架構(gòu)數(shù)組維數(shù)不受限制, 可以是一維、二維或更高維,不過一維架構(gòu)數(shù)組用得最多。架構(gòu)數(shù)組對架構(gòu)的編址方法也有單下標(biāo)編址和全下標(biāo)編址兩種。2.7.1 架構(gòu)數(shù)組的創(chuàng)建三種方法:1)直接創(chuàng)建;2)利用構(gòu)造函數(shù)(struct)創(chuàng)建;3)利用轉(zhuǎn)換函數(shù)創(chuàng)建。1. 直接創(chuàng)建法(直接對各個架構(gòu)的域賦值)例1 單架

29、構(gòu)(1x1的架構(gòu)數(shù)組)的創(chuàng)建創(chuàng)建一個架構(gòu),用來存儲一名學(xué)生的姓名、學(xué)號、性別、年齡等信息。程序如下:s.name= li ming;s.no=19990101;s.sex=m;s.age=18;s例2在例1的基礎(chǔ)上,再增加1名學(xué)生的信息。s(2).name=zhang mei;s(2).sex=f;ss1=s(1)s2=s(2)也可以通過看作空間瀏覽器查看已建立的架構(gòu)數(shù)組的內(nèi)容。例3創(chuàng)建一個架構(gòu)數(shù)組,用來存儲一個班級的信息,包括:班主任老師信息(教師資格證編號、姓名、年齡)、學(xué)生信息(包括學(xué)號、姓名)、課程信息(包括:課程名稱、任課教師姓名、學(xué)生成績)可以按照如下方法創(chuàng)建:classinfo.

30、supervisor.no=01065;classinfo.supervisor.name=mu guowang;classinfo.supervisor.age=41;classinfo.students(1).xh=090101;classinfo.students(1).xm=li ming;classinfo.students(2).xh=090102;classinfo.students(2).xm=wang ming;classinfo.students(3).xh=090103;classinfo.students(3).xm=zhang hai;classinfo.course

31、s(1). name=matlab;classinfo.courses(1).teacher=mu guowang;classinfo.courses(1).score=75 80 85;classinfo.courses(2). name=mathematical modeling;classinfo.courses(2).teacher=liu huizhao;classinfo.courses(2).score=70 80 90;例4設(shè)某高中有3個年級,每個年級6個班。將例3中的classinfo 擴(kuò)展成3x6的架構(gòu)數(shù)組,用來存儲每個年級每個班的信息,包括:班主任老師信息(教師資格證編號

32、、姓名、年齡)、學(xué)生信息(包括學(xué)號、姓名)、課程信息(包括:課程名稱、任課教師姓名、學(xué)生成績)方法:可用例3中的方法對 classinfo中的每個元素(架構(gòu))classinfo(1,1), classinfo(1,2), classinfo(1,6),classinfo(2,1), classinfo(2,2), classinfo(2,6),classinfo(3,1), classinfo(3,2), classinfo(3,6)分別賦值。以下是對架構(gòu)classinfos(1,1)和classinfos(3,6)賦值的語句,類似地,可以對其它元素(架構(gòu))進(jìn)行賦值。classinfo(3,6

33、).supervisor.no=01002;classinfo(3,6).supervisor.name=li laoshi;classinfo(3,6).supervisor.age=40;classinfo(3,6).students(1).xh=090101;classinfo(3,6).students(1).xm=liu ming;classinfo(3,6).students(2).xh=090102;classinfo(3,6).students(2).xm=ma ming;classinfo(3,6).students(3).xh=090103;classinfo(3,6).s

34、tudents(3).xm=zhang hai;classinfo(3,6).courses(1). name=chinese;classinfo(3,6).courses(1).teacher=zhao laosh;classinfo(3,6).courses(1).score=75 80 85;classinfo(3,6).courses(2). name=english;classinfo(3,6).courses(2).teacher=ma laoshi;classinfo(3,6).courses(2).score=70 80 90;2. 利用構(gòu)造函數(shù)(struct)創(chuàng)建架構(gòu)數(shù)組格式

35、: s=struct(field1,values1,field2,values2,.)功能:用指定的域名和域值創(chuàng)建架構(gòu)數(shù)組s。其中,values1, values2必須是相同大小的元胞數(shù)組、1x1的元胞數(shù)組或其它類型的任意數(shù)據(jù),也可以是空數(shù)組()。注意:如果values1, values2中沒有包含2個以上元素的元胞數(shù)組,則s含有一個元素(架構(gòu));否則, values1, values2中除了1x1 的元胞數(shù)組外,其它元胞數(shù)組的大小必須相同,最后,s的大小和values1, values2中含有2個以上元素的元胞數(shù)組大小相同。 clearclassinfo.supervisor.no=0100

36、1;classinfo.supervisor.name=zhang laoshi;classinfo.supervisor.age=38;classinfo.students(1).xh=090101;classinfo.students(1).xm=li ming;classinfo.students(2).xh=090102;classinfo.students(2).xm=wang ming;classinfo.students(3).xh=090103;classinfo.students(3).xm=zhang hai;classinfo.courses(1). name=chine

37、se;classinfo.courses(1).teacher=wang laosh;classinfo.courses(1).score=75 80 85;classinfo.courses(2). name=maths;classinfo.courses(2).teacher=liu laoshi;classinfo.courses(2).score=70 80 90;例5 用struct 函數(shù)構(gòu)造例1中的架構(gòu)s例1中的語句:s.name= li ming;s.no=19990101;s.sex=m;s.age=18;用struct函數(shù)s=struct(name, li ming, no,

38、 19990101,. sex, m , age,18)例6 用struct 函數(shù)構(gòu)造例2中的架構(gòu)數(shù)組s例2中的語句:s.name= li ming; s.no=19990101;s.sex=m;s.age=18;s(2).name=zhang mei; s(2).sex=f;s(1),s(2)用struct函數(shù):s=struct(name, li ming, zhang mei, no, 19990101, sex, m , f , age, 18)s(1),s(2)思考:和例2的結(jié)果不一樣,如何修改,使得用struct函數(shù)構(gòu)造的結(jié)果和例2完全相同?例7 對于例4,可以先構(gòu)造含有superv

39、isor,students,courses三個域的3x6的空架構(gòu)數(shù)組classinfo,然后,再分別對每個元素(架構(gòu))賦值。用struct函數(shù)如何實現(xiàn)?方法如下:emptyvalues=cell(3,6);classinfo=struct(supervisor, emptyvalues, students, emptyvalues, courses, emptyvalues)或classinfo=struct(supervisor, emptyvalues, students, , courses, )或classinfo(3,6)=struct(supervisor, , students,

40、 , courses, )對于每個i=1:3,j=1:6,也可以類似地對 classinfo(i,j). supervisor, classinfo(i,j).students和classinfo(i,j).courses進(jìn)行賦值。例如,對于classinfo(3,6). supervisor,例4中的賦值語句為:classinfo(3,6).supervisor.no=01002;classinfo(3,6).supervisor.name=li laoshi;classinfo(3,6).supervisor.age=40;采用struct函數(shù)可以改寫為:classinfo(3,6).su

41、pervisor=struct(no, 01002, name,.li laoshi, age,40);在例4中,對classinfo(3,6).courses的賦值語句為:classinfo(3,6).courses(1). name=chinese;classinfo(3,6).courses(1).teacher=zhao laosh;classinfo(3,6).courses(1).score=75 80 85;classinfo(3,6).courses(2). name=english;classinfo(3,6).courses(2).teacher=ma laoshi;cla

42、ssinfo(3,6).courses(2).score=70 80 90;采用struct函數(shù)可以改寫為:classinfo(3,6) .courses=struct(name,chinese, english, teacher,zhao laosh, ma laosh, score,75 80 85, 70 80 90)或者寫成二個語句:classinfo(3,6) .courses(1)=struct(name, chinese, teacher, zhao laosh, score,75 80 85)classinfo(3,6) .courses(2)=struct(name, eng

43、lish, teacher, ma laosh, score, 70 80 90)3. 利用轉(zhuǎn)換函數(shù)創(chuàng)建架構(gòu)數(shù)組架構(gòu)數(shù)組還可以通過元胞數(shù)組轉(zhuǎn)換得到。格式:s=cell2struct(c,fields,d)功能:把元胞數(shù)組c轉(zhuǎn)換為架構(gòu)數(shù)組s。其中,d 表示將第d維轉(zhuǎn)換為域,fields給出了轉(zhuǎn)換后的域名字符串(可以是由字符串組成的元胞數(shù)組或字符串矩陣 )。注意:size(c,d) (c的第d維的大小) 必須和fields中給出的域名字符串個數(shù)相一致。例如:c=li ming, male,28; f=name, sex, age; 則s=cell2struct(c,f,2)等價于s=struct(

44、name, li ming, sex, male, age,28)補充:由架構(gòu)數(shù)組到元胞數(shù)組的轉(zhuǎn)換格式:c=struct2cell(s)功能:把mxn的架構(gòu)數(shù)組s(設(shè)有p個域)轉(zhuǎn)換為pxmxn的元胞數(shù)組。設(shè)field_k是第k個域的域名,則:ck,i,j=s(i,j).(field_k)如果s高維結(jié)構(gòu)數(shù)組,則c的大小是p size(s)例: 設(shè)有s=struct(name, li ming, sex, male, age,28),則 c=struct2cell(s)得到的結(jié)果是:c=li ming; male; 28例:設(shè)1x4的架構(gòu)數(shù)組s,內(nèi)容如下:s(1).name=a;s(1).no=1

45、;s(1).age=11;s(2).name=b;s(2).no=2;s(2).age=12;s(3).name=c;s(3).no=3;s(3).age=13;s(4).name=d;s(4).no=4;s(4).age=14;則c=struct2cell(s)得到3x1x4 的元胞數(shù)組cc1,1,1=a;c1,1,2=b;c1,1,3=c;c1,1,4=d;c2,1,1=1;c2,1,2=2;c2,1,3=3;c2,1,4=4;c3,1,1=11;c3,1,2=12;c3,1,3=13;c3,1,4=14;2.7.2 架構(gòu)數(shù)組元素的引用架構(gòu)數(shù)組的元素可以通過架構(gòu)數(shù)組名稱、下標(biāo)、域名來引用。

46、具體格式為:架構(gòu)數(shù)組名(下標(biāo)). .域名域名例如:例如:s.name=s.name=li mingli ming; ; s.no=s.no=1999010119990101;s.class=;s.class=199901199901; ;s(2).name=s(2).name=zhang meizhang mei; s(2).no=; s(2).no=1999010219990102; ;s(2).sex=s(2).sex=f f; s(2).exams=90 82 88; s(2).exams=90 82 88;average(2)= (s(2).exams(1)+s(2).exams(2)

47、 average(2)= (s(2).exams(1)+s(2).exams(2) +s(2).exams(3)/3+s(2).exams(3)/3s(2).average=mean(s(2).exams)s(2).average=mean(s(2).exams)動態(tài)域名動態(tài)域名(域名是字符串變量)的情況輸入help paren,有關(guān)于動態(tài)域名的如下說明:.() dot-parentheses are used to reference a structure using a variable for the fieldname. the fieldname is called dynamic

48、 because the name is established at runtime. the syntax for referencing a structure s with dynamic fieldname f is s.(f) 例如:fieldname=average; s(1).(fieldname)s(2).(fieldname)2.7.3 域值操作函數(shù) 以下介紹獲取架構(gòu)數(shù)組的域名,獲取架構(gòu)某個域的域值、設(shè)置架構(gòu)某個域的域值的幾個函數(shù)。1. 獲取架構(gòu)數(shù)組的域名函數(shù) fieldnames格式:names = fieldnames(s)功能:返回一個元胞數(shù)組names, names

49、i是架構(gòu)數(shù)組s的第i個域的域名(字符串),因此,names是一個由字符串組成的元胞數(shù)組。英文:names = fieldnames(s) returns a cell array of strings containing the structure field names associated with the structure s.舉例:設(shè)s.no=01065 ,s.name=mu, s.age=41則names= fieldnames(s)返回元胞數(shù)組no, name, ageclass(names)2. 獲取域值的函數(shù)-getfield格式: f = getfield(s,field

50、) 功能:獲取單架構(gòu)s由field 指定的域的域值,注意:s必須是1x1 的架構(gòu)數(shù)組。等價于語句 f=s.field。英文:f = getfield(s,field) returns the contents of the specified field. this is equivalent to the syntax f = s.field.s must be a 1-by-1 structure. 例:設(shè)s.no=01065 ,s.name=mu, s.age=41,則no=getfield(s,no)等價于no=s.no格式: f = getfield (s,i,j,field,k)

51、功能:等價于f = s(i,j).field(k)例: 設(shè)有classinfo(3,6).scores=70 75 80 85 90,則f=getfield(classinfo,3,6, scores,2)等價于f= classinfo(3,6).scores(2)例:設(shè)有class(6).student(2).scores= 70 75 80; 75 80 85; 80 85 90 ,則f=getfield(class,6,student,2,scores)等價于f= class(6). student(2).scores,f=getfield(class,6,student,2,score

52、s,3,1)等價于f= class(6). student(2).scores(3,1)例:設(shè)class(6).student(2).scores= 70 75 80; 75 80 85; 80 85 90則f=getfield(class,6,student,2,scores,3,1)等價于f= class(6). student(2).scores(3,1) 而不等價于f= class(6). student(2).scores3,13. 設(shè)置域值的函數(shù)-setfield格式: s = setfield(s,field,v) 功能:等價于語句 s.field=v。將單架構(gòu)s由field 指

53、定的域的域值設(shè)置為v,注意:s必須是1x1 的架構(gòu)數(shù)組。英文:s = setfield(s,field) sets the contents of the specified field to the value v. this is equivalent to the syntax s.field = v. s must be a 1-by-1 structure. the changed structure is returned.例:設(shè)s.no=01065 ,s.name=mu, s.age=41,則s=setfield(s, no,1065)等價于s.no=1065格式: s = se

54、tfield (s,i,j,field,k,v) 功能:等價于s(i,j).field(k)=v例: 設(shè)有classinfo(3,6).scores=70 75 80 85 90,則classinfo=setfield(classinfo,3,6, scores,2,65)等價于classinfo(3,6).scores(2)=65例:設(shè)有class(6).student(2).scores= ;scs=70 75 80; 75 80 85; 80 85 90 class=setfield(class,6,student,2,scores,scs)等價于class(6). student(2).scores=scsclass=setfield(class,6,student,2,scores,3,1,85)等價于class(6). student(2).scores(3,1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論