matlab中使用結(jié)構(gòu)體匯總(最新整理)_第1頁(yè)
matlab中使用結(jié)構(gòu)體匯總(最新整理)_第2頁(yè)
matlab中使用結(jié)構(gòu)體匯總(最新整理)_第3頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、matlab 中使用結(jié)構(gòu)體結(jié)構(gòu)(struct)數(shù)組要在 maltab 中實(shí)現(xiàn)比較復(fù)雜的編程,就不能不用 struct 類型。而且在 matlab 中實(shí)現(xiàn) struct 比 c 中更為方便。4. 3.1 結(jié)構(gòu)數(shù)組的創(chuàng)建matlab 提供了兩種定義結(jié)構(gòu)的方式:直接應(yīng)用和使用 struct 函數(shù)。1. 使用直接引用方式定義結(jié)構(gòu)與建立數(shù)值型數(shù)組一樣,建立新 struct 對(duì)象不需要事先申明,可以直接引用,而且可以動(dòng)態(tài)擴(kuò)充。比如建立一個(gè)復(fù)數(shù)變量 x:x.real = 0; % 創(chuàng)建字段名為 real,并為該字段賦值為 0x.imag = 0 % 為 x 創(chuàng)建一個(gè)新的字段 imag,并為該字段賦值為0x

2、= real: 0imag: 0然后可以將旗動(dòng)態(tài)擴(kuò)充為數(shù)組:x(2).real = 0; % 將 x 擴(kuò)充為 12 的結(jié)構(gòu)數(shù)組x(2).imag = 0;在任何需要的時(shí)候,也可以為數(shù)組動(dòng)態(tài)擴(kuò)充字段,如增加字段 scale:x(1).scale = 0;這樣,所有 x 都增加了一個(gè) scale 字段,而 x(1)之外的其他變量的scale 字段為空:x(1) % 查看結(jié)構(gòu)數(shù)組的第一個(gè)元素的各個(gè)字段的內(nèi)容ans = real: 0imag: 0scale: 0x(2) % 查看結(jié)構(gòu)數(shù)組的第二個(gè)元素的各個(gè)字段的內(nèi)容,注意沒(méi)有賦值的字段為空ans = real: 0imag: 0 scale: 應(yīng)該注

3、意的是,x 的 real、imag、scale 字段不一定是單個(gè)數(shù)據(jù)元素, 它們可以是任意數(shù)據(jù)類型,可以是向量、數(shù)組、矩陣甚至是其他結(jié)構(gòu)變量或元胞數(shù)組,而且不同字段之間其數(shù)據(jù)類型不需要相同。例如: clear x; x.real = 1 2 3 4 5; x.imag = ones(10,10);數(shù)組中不同元素的同一字段的數(shù)據(jù)類型也不要求一樣:x(2).real = 123;x(2).imag = rand(5,1);甚至還可以通過(guò)引用數(shù)組字段來(lái)定義結(jié)構(gòu)數(shù)據(jù)類型的某字段:x(3).real = x(1); x(3).imag = 3; x(3) ans =real: 1x1 struct im

4、ag: 3下面看一個(gè)實(shí)際的例子來(lái)熟悉直接引用方式定義與顯示結(jié)構(gòu)?!纠?4.3.1-1】 溫室數(shù)據(jù)(包括溫室名、容量、溫度、濕度等)的創(chuàng)建與顯示。(1) 直接對(duì)域賦值法產(chǎn)生結(jié)構(gòu)變量green_ = 一號(hào)溫室; % 創(chuàng)建溫室名字段green_house.volume = 2000 立方米; % 創(chuàng)建溫室容量字段green_house.parameter.temperature = 31.2 30.4 31.628.7 % 創(chuàng)建溫室溫度字段29.7 31.1 30.9 29.6;green_house.parameter.humidity = 62.1 59.5 57.7 61.

5、5;% 創(chuàng)建溫室濕度字段62.0 61.9 59.2 57.5;(2) 顯示結(jié)構(gòu)變量的內(nèi)容green_house % 顯示結(jié)構(gòu)變量結(jié)構(gòu)green_house =name: 一 號(hào) 溫 室 volume: 2000 立方米parameter: 1x1 structgreen_house.parameter % 用域作用符號(hào). 顯示指定域(parameter)中內(nèi)容ans =temperature: 2x4 double humidity: 2x4 doublegreen_house.parameter.temperature % 顯示 temperature域中的內(nèi)容ans =31.2000 3

6、0.4000 31.6000 28.700029.7000 31.1000 30.9000 29.6000【例 4.3.1-2】在上例的基礎(chǔ)上,創(chuàng)建結(jié)構(gòu)數(shù)組用以保存一個(gè)溫室群的數(shù)據(jù)。green_house(2,3).name = 六號(hào)溫室; %產(chǎn)生 23 結(jié)構(gòu)數(shù)組green_house % 顯示結(jié)構(gòu)數(shù)組的結(jié)構(gòu)green_house =2x3 struct array with fields:name volume parametergreen_house(2,3) % 顯示結(jié)構(gòu)數(shù)組元素的結(jié)構(gòu)ans =name: 六號(hào)溫室 volume: parameter: 2. 使用 struct 函數(shù)創(chuàng)建

7、結(jié)構(gòu)使用 struct 函數(shù)也可以創(chuàng)建結(jié)構(gòu),該函數(shù)產(chǎn)生或吧其他形式的數(shù)據(jù)轉(zhuǎn)換為結(jié)構(gòu)數(shù)組。struct 的使用格式為:s = sturct(field1,values1,field2,values2,);該函數(shù)將生成一個(gè)具有指定字段名和相應(yīng)數(shù)據(jù)的結(jié)構(gòu)數(shù)組,其包含的數(shù)據(jù) values1、valuese2 等必須為具有相同維數(shù)的數(shù)據(jù),數(shù)據(jù)的存放位置域其他 結(jié)構(gòu)位置一一對(duì)應(yīng)的。對(duì)于 struct 的賦值用到了元胞數(shù)組。數(shù)組 values1、values2 等可以是元胞數(shù)組、標(biāo)量元胞單元或者單個(gè)數(shù)值。每個(gè) values 的數(shù)據(jù)被賦值給相應(yīng)的 field 字段。當(dāng) valuesx 為元胞數(shù)組的時(shí)候,生成的

8、結(jié)構(gòu)數(shù)組的維數(shù)與元胞數(shù)組的維數(shù)相同。而在數(shù)據(jù)中不包含元胞的時(shí)候,得到的結(jié)構(gòu)數(shù)組的維數(shù)是 11 的。例如:s = struct(type,big,little,color,blue,red,x,3,4) s =1x2 struct array with fields:type color x得到維數(shù)為 12 的結(jié)構(gòu)數(shù)組 s,包含了 type、color 和 x 共 3 個(gè)字段。這是因?yàn)樵?struct 函數(shù)中big,little、blue,red和3,4都是 12 的元胞數(shù)組,可以看到兩個(gè)數(shù)據(jù)成分分別為: s(1,1)ans = type: big color: blue x: 3s(1,2)a

9、ns = type: little color: red x: 4相應(yīng)的,如果將 struct 函數(shù)寫(xiě)成下面的形式: s =struct(type,big;little,color,blue;red,x,3;4) s =2x1 struct array with fields: typecolor x則會(huì)得到一個(gè) 21 的結(jié)構(gòu)數(shù)組。下面給出利用 struct 構(gòu)建結(jié)構(gòu)數(shù)組的具體實(shí)例?!纠?4.3.1-3】利用函數(shù) struct,建立溫室群的數(shù)據(jù)庫(kù)。(1) struct 預(yù)建立空結(jié)構(gòu)數(shù)組方法之一a = cell(2,3); % 創(chuàng)建 23 的元胞數(shù)組green_house_1=struct(na

10、me,a,volume,a,parameter,a( 1,2)green_house_1 =2x3 struct array with fields:name volume parameter(2) struct 預(yù)建空結(jié)構(gòu)數(shù)組方法之二green_house_2=struct(name,a,volume,parameter,)green_house_2 =2x3 struct array with fields: namevolume parameter(3) struct 預(yù)建空結(jié)構(gòu)數(shù)組方法之三green_hopuse_3(2,3)=struct(name,volume,param eter

11、,)green_hopuse_3 =2x3 struct array with fields:name volume parameter(4) struct 創(chuàng)建結(jié)構(gòu)數(shù)組方法之四a1= 六 號(hào) 房 ;a2=3200 立 方 米 ; green_house_4(2,3)=struct(name,a1,volume,a2,param eter,);t6=31.2,30.4,31.6,28.7;29.7,31.1,30.9,29.6;green_house_4(2,3).parameter.temperature=t6; green_house_4ans =2x3 struct array with

12、 fields: namevolume parameter4. 3.2 結(jié)構(gòu)數(shù)組的操作matlab 中專門用于對(duì)結(jié)構(gòu)數(shù)組的操作的函數(shù)并不多,通過(guò) help datatypes 獲取數(shù)據(jù)類型列表,可以看到其中的結(jié)構(gòu)數(shù)據(jù)類型的有關(guān)的函數(shù),主要如表 4.3.1 所示。表 4.3.1 結(jié)構(gòu)數(shù)組的操作函數(shù)函數(shù)名 功能描述 函數(shù)名 功能描述deal把輸入處理成輸出 fieldnames獲取結(jié)構(gòu)的字段名getfield獲取結(jié)構(gòu)中指定字段的值 rmfield刪除結(jié)構(gòu)的字段(不是字段內(nèi)容)setfield設(shè)置結(jié)構(gòu)數(shù)組中指定的字段的值 struct創(chuàng)建結(jié)構(gòu)數(shù)組struct2cell結(jié)構(gòu)數(shù)組轉(zhuǎn)化成元胞數(shù)組 isfi

13、eld判斷是否存在該字段isstruct判斷某變量是否是結(jié)構(gòu)類型下面舉一些具體的例子說(shuō)明如果對(duì)結(jié)構(gòu)數(shù)組加以操作?!纠?4.3.2-1】 本例目的:一,演示函數(shù) fieldnames ,getfield , setfield 的使用方法;二,讓讀者感受到結(jié)構(gòu)數(shù)組對(duì)應(yīng)用工具包的影響;三,演示 struct 函數(shù)把“對(duì)象”轉(zhuǎn)換為結(jié)構(gòu)的應(yīng)用。本例為獲得一個(gè)演練的 結(jié)構(gòu),借助 toolbox control 工具包中的 tf 函數(shù),先產(chǎn)生一個(gè)用傳遞函數(shù)描寫(xiě)的 lti 線性時(shí)不變 2 輸入 2 輸出系統(tǒng) 。(1) 產(chǎn)生 2 輸入 2 輸出系統(tǒng)的傳遞函數(shù)陣“對(duì)象” stf=tf(3,2;4 1,1,1 3

14、2,1 1 1;1 2 2 1,1 0)transfer function from input 1 to output. 3#1: s2 + 3 s + 24 s + 1#2: s3 + 2 s2 + 2 s + 1transfer function from input 2 to output. 2#1: s2 + s + 1 1#2: -s(2) 為本例演示,把上述的 lti 對(duì)象 stf 轉(zhuǎn)換為結(jié)構(gòu)sstf=struct(stf)% 把對(duì)象轉(zhuǎn)換成結(jié)構(gòu),并顯示結(jié)構(gòu)的組成sstf =num: 2x2 cellden: 2x2 cell variable: slti: 1x1 lti(3)

15、獲得結(jié)構(gòu)數(shù)組 sstf 的域名fn=fieldnames(sstf) % 獲得域名元胞數(shù)組 fn class(fn)% 檢查 fn 的類別fn =numden variable ltians = cell(4) 獲取 sstf.den(2,1)域的內(nèi)容fc=getfield(sstf,den,2,1)% 相當(dāng)于fc=ssft.den(2,1)fc1% 與 celldisp(fc)的作用大致相當(dāng)poly2str(fc1,s),% 為了把多項(xiàng)式顯示成習(xí)慣的形式fc =1x4 double ans =1 2 2 1ans =s3 + 2 s2 + 2 s + 1(5) 重新設(shè)置 sstf.num(2

16、,1)域的內(nèi)容sstf.num2,1% 顯示原始情況sstf=setfield(sstf,num,2,1,1 3 1); %注意“花括號(hào)”的使用sstf.num2,1% 顯示被重新設(shè)置后的情況ans = 0 0 4 1ans = 1 3 1【例 4.3.2-2】本例演示結(jié)構(gòu)數(shù)組 sstf 的擴(kuò)充和收縮。(本例以例4.3.2-1 的運(yùn)行為基礎(chǔ)。)(1) 原結(jié)構(gòu)是一個(gè)“單結(jié)構(gòu)” size(sstf)ans = 1 1(2) 演示結(jié)構(gòu)的擴(kuò)充sstf(2,2)=struct(tf(1,1 1)% 把 1/(s+1)放在第 2 行第2 列結(jié)構(gòu)中size(sstf)sstf =2x2 struct arr

17、ay with fields:num den variable ltians = 2 2(3) 演示結(jié)構(gòu)數(shù)組的收縮:刪除結(jié)構(gòu)數(shù)組的第 1 行sstf(1, =% 收縮成為 的結(jié)構(gòu)s22n=sstf(1,2).num,s22d=sstf(1,2).den% 取出第 2結(jié)構(gòu) num 域和 den 域的內(nèi)容printsys(s22n1,s22d1)% 顯示成習(xí)慣的表達(dá)形式sstf =1x2 struct array with fields: numden variable ltis22n =1x2 doubles22d =1x2 double num/den = 1s + 1【例 4.3.2-3】對(duì)

18、結(jié)構(gòu)數(shù)組進(jìn)行域的增添和刪減操作。(1) 創(chuàng)建結(jié)構(gòu)數(shù)組clear,for k=1:10;department(k).number=no.,int2str(k);end departmentdepartment =1x10 struct array with fields:number(2) 增添域:在數(shù)組中任何一個(gè)結(jié)構(gòu)上進(jìn)行的域增添操作,其影響遍及整個(gè)結(jié)構(gòu)數(shù)組department(1).teacher=40;department(1).student=300; department(1).pc_computer=40;department department =1x10 struct arra

19、y with fields:number teacher student pc_computer(3) 增添子域的操作只影響被操作的那個(gè)具體結(jié)構(gòu),而不是影響整個(gè)結(jié)構(gòu)數(shù)組department(2).teacher.male=35;department(2).teacher.f emale=13;d2t=department(2).teacher% 第2 結(jié)構(gòu)teacher 域包含兩個(gè)子域d1t=department(1).teacher% 第1 結(jié)構(gòu)teacher 域僅是一個(gè)數(shù)d2t =male: 35female: 13 d1t =40(4) 刪除子域的操作也只影響被操作的那個(gè)具體結(jié)構(gòu)depa

20、rtment(2).teacher=rmfield(department(2).teacher,m ale);department(2).teacher ans =female: 13(5) 刪除域的操作是對(duì)整個(gè)結(jié)構(gòu)數(shù)組實(shí)施的department=rmfield(department,student)% 刪除一個(gè)域department =1x10 struct array with fields:number teacher pc_computerdepartment=rmfield(department,teacher;pc_computer)% 刪除 2 個(gè)域department =1x1

21、0 struct array with fields:number【例 4.3.2-4】數(shù)值運(yùn)算操作和函數(shù)在結(jié)構(gòu)域上的作用。n_ex = 5; % 結(jié)構(gòu)數(shù)組的長(zhǎng)度f(wàn)or k = 1:n_ex,% 創(chuàng)建 15 結(jié)構(gòu)數(shù)組ex(k).f = (k-1)*n_ex + 1:5;end;ex% 顯示結(jié)構(gòu)數(shù)組的結(jié)構(gòu)ex =1x5 struct array with fields:f%顯示結(jié)構(gòu)數(shù)組的域中內(nèi)容disp(blanks(10) 結(jié)構(gòu)域中內(nèi)容) for k=1:n_ex,disp(ex(k).f),end 結(jié)構(gòu)域中內(nèi)容1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18

22、 19 2021 22 23 24 25class(ex(1).f)% 檢查域中內(nèi)容的類型ans = double% 對(duì)各結(jié)構(gòu)域中數(shù)值數(shù)組相應(yīng)位置的數(shù)據(jù)相加求和sum_f=zeros(1,5)for k=1:n_ex,sum_f=sum_f+ex(k).f;end,sum_f sum_f =55 60 65 70 75% 對(duì)結(jié)構(gòu)數(shù)組域中各元素分別求平方根disp(blanks(20) ex.f 的平方根值) for k=1:n_ex,disp(sqrt(ex(k).f),endex.f 的平方根值1.0000 1.4142 1.7321 2.0000 2.23612.4495 2.6458 2

23、.8284 3.0000 3.16233.3166 3.4641 3.6056 3.7417 3.87304.0000 4.1231 4.2426 4.3589 4.47214.5826 4.6904 4.7958 4.8990 5.0000【例 4.3.2-5】 指令 struct2cell 和 cell2struct 的使用。(1) 創(chuàng)建“帶 2 個(gè)域的 結(jié)構(gòu)數(shù)組” for k=1:5,ex(k).s=no. int2str(k);ex(k).f=(k-1)*5+1:5;end(2) 顯示結(jié)構(gòu)數(shù)組的內(nèi)容fprintf(%sn,ex.s 域的內(nèi)容 );fprintf(%s,blanks(4)

24、for k=1:5;fprintf(%s,ex(k).s blanks(1);endfprintf(%sn,blanks(1),fprintf(%sn,ex.f 域的內(nèi)容 ) for k=1:5;disp(ex(k).f);end%顯示 ex.f 域內(nèi)容ex.s 域的內(nèi)容no.1 no.2 no.3 no.4 no.5 ex.f 域的內(nèi)容1 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 25(3) 把 ex 結(jié)構(gòu)數(shù)組轉(zhuǎn)換為元胞數(shù)組c_ex=struct2cell(ex); % 帶 2 個(gè)域的(15)結(jié)構(gòu)數(shù)組轉(zhuǎn)換為(215)元胞

25、數(shù)組size(c_ex)fprintf(%s,c_ex1,1,1,blanks(3)% 顯示 c_ex 第 1頁(yè)第 1 行第 1 列內(nèi)容fprintf(%5g,c_ex2,1,1)% 顯示c_ex 第2 頁(yè)第1 行第 1 列內(nèi)容ans = 2 1 5no.1 1 2 3 4 5(4) 把元胞數(shù)組轉(zhuǎn)換為結(jié)構(gòu)數(shù)組之一fs=s_char;f_num;% 用元胞數(shù)組預(yù)建域名字符串ex1=cell2struct(c_ex,fs,1)% 元胞數(shù)組向結(jié)構(gòu)數(shù)組轉(zhuǎn)換ex1 =1x5 struct array with fields: s_charf_numricex1(1)% 觀察新結(jié)構(gòu) ex1 第一結(jié)構(gòu)的情況

26、ans =s_char: no.1 f_numric: 1 2 3 4 5(5) 把元胞數(shù)組轉(zhuǎn)換為結(jié)構(gòu)數(shù)組之二ex2=cell2struct(c_ex,xx,2) ex2 =2x5 struct array with fields:xx(6) 把元胞數(shù)組轉(zhuǎn)換為結(jié)構(gòu)數(shù)組之三yy=strvcat(y1,y2,y3,y4,y5);ex3=cell2struct(c_ex,y y,3)ex3 =2x1 struct array with fields: y1y2 y3 y4 y5ex3(1)% 觀察第一結(jié)構(gòu)情況ans = y1: no.1y2: no.2y3: no.3y4: no.4y5: no.5

27、ex3(2)% 觀察第二結(jié)構(gòu)情況ans =y1: 1 2 3 4 5y2: 6 7 8 9 10y3: 11 12 13 14 15y4: 16 17 18 19 20y5: 21 22 23 24 25【例 4.3.2-6】 帶子域的結(jié)構(gòu)數(shù)組轉(zhuǎn)換為元胞數(shù)組。本例中的 ex結(jié)構(gòu)數(shù)組由例 4.2.2-5 生成,然后再運(yùn)行以下程序。ex(1,1).s% 原結(jié)構(gòu) ex(1,1).s 中的內(nèi)容ans =no.1% 增設(shè)子域,并把 ex 結(jié)構(gòu)數(shù)組擴(kuò)充為(35)。ex(1,1).s.sub=sub 1;% 原 ex(1,1).s 中的字符串將因本指令而消失ex(3,1).s.sub=sub 3;ex(3,1).s.num=1/3;ex(1,1).s% 經(jīng)新賦值后,ex(1,1).s 中的內(nèi)容ans =sub: sub 1ex(3,1).s% 經(jīng)新賦值后,ex(3,1).s 中的內(nèi)容ans =sub: sub 3num: 0.3333c_ex_sub=struct2cell(ex)% 把結(jié)構(gòu)轉(zhuǎn)換為元胞數(shù)組c_ex_sub(:,:,1) =1x1 struct 1x1 struct 1x5 double c_ex_sub(:,:,2) =no.2 1x5 double c_ex_sub(:,:,3

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論