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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(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,并為該字段賦值為0 x = real: 0im

2、ag: 0 然后可以將旗動(dòng)態(tài)擴(kuò)充為數(shù)組:x(2).real = 0; % 將x擴(kuò)充為1×2的結(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: 0 x(2) % 查看結(jié)構(gòu)數(shù)組的第二個(gè)元素的各個(gè)字段的內(nèi)容,注意沒有賦值的字段為空ans = r

3、eal: 0imag: 0scale:  應(yīng)該注意的是,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); 甚至還可以通過引用數(shù)組字段來定義結(jié)構(gòu)數(shù)據(jù)類型的某字段:x(3).real = x(1);

4、 x(3).imag = 3; x(3) ans = real: 1x1 structimag: 3 下面看一個(gè)實(shí)際的例子來熟悉直接引用方式定義與顯示結(jié)構(gòu)?!纠?.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

5、30.4 31.6 28.7 % 創(chuàng)建溫室溫度字段29.7 31.1 30.9 29.6;green_house.parameter.humidity = 62.1 59.5 57.7 61.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 struct green_house.parameter % 用域作用符號(hào). 顯示

6、指定域(parameter)中內(nèi)容 ans = temperature: 2x4 doublehumidity: 2x4 double green_house.parameter.temperature % 顯示temperature域中的內(nèi)容 ans =31.2000 30.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)生2

7、5;3結(jié)構(gòu)數(shù)組green_house % 顯示結(jié)構(gòu)數(shù)組的結(jié)構(gòu) green_house = 2x3 struct array with fields:namevolumeparameter green_house(2,3) % 顯示結(jié)構(gòu)數(shù)組元素的結(jié)構(gòu) ans = name: '六號(hào)溫室'volume: parameter:  2. 使用struct函數(shù)創(chuàng)建結(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',v

8、alues1,'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í)候,生成的結(jié)構(gòu)數(shù)組的維數(shù)與元胞數(shù)組的維數(shù)相同。而在數(shù)據(jù)中不包含元胞的時(shí)候,得到的結(jié)構(gòu)數(shù)組的維數(shù)是1×1的。例如:s = struct('type&#

9、39;,'big','little','color','blue','red','x',3,4) s = 1x2 struct array with fields:typecolorx 得到維數(shù)為1×2的結(jié)構(gòu)數(shù)組s,包含了type、color和x共3個(gè)字段。這是因?yàn)樵趕truct函數(shù)中'big','little'、'blue','red'和3,4都是1×2的元胞數(shù)組,可以看到兩個(gè)數(shù)據(jù)成分

10、分別為:s(1,1) ans = type: 'big'color: 'blue'x: 3    s(1,2) ans = type: 'little'color: 'red'x: 4 相應(yīng)的,如果將struct函數(shù)寫成下面的形式:s = struct('type','big''little','color','blue''red','x',

11、3;4) s = 2x1 struct array with fields:typecolorx 則會(huì)得到一個(gè)2×1的結(jié)構(gòu)數(shù)組。下面給出利用struct構(gòu)建結(jié)構(gòu)數(shù)組的具體實(shí)例?!纠?.3.1-3】利用函數(shù)struct,建立溫室群的數(shù)據(jù)庫(kù)。(1) struct預(yù)建立空結(jié)構(gòu)數(shù)組方法之一a = cell(2,3); % 創(chuàng)建2×3的元胞數(shù)組green_house_1=struct('name',a,'volume',a,'parameter',a(1,2)green_house_1 = 2x3

12、 struct array with fields:namevolumeparameter (2)struct預(yù)建空結(jié)構(gòu)數(shù)組方法之二green_house_2=struct('name',a,'volume','parameter',)     green_house_2 = 2x3 struct array with fields:namevolumeparameter (3)struct預(yù)建空結(jié)構(gòu)數(shù)組方法之三green_hopuse_3(2,3)=struct(&

13、#39;name','volume','parameter',) green_hopuse_3 = 2x3 struct array with fields:namevolumeparameter (4)struct創(chuàng)建結(jié)構(gòu)數(shù)組方法之四a1='六號(hào)房'a2='3200立方米'green_house_4(2,3)=struct('name',a1,'volume',a2,'parameter',);T6=31.2,30.4,31.6,28.7;29

14、.7,31.1,30.9,29.6;             green_house_4(2,3).parameter.temperature=T6;            green_house_4 ans = 2x3 struct array with fields:namevolumeparameter 4. 3.2 結(jié)構(gòu)

15、數(shù)組的操作MATLAB中專門用于對(duì)結(jié)構(gòu)數(shù)組的操作的函數(shù)并不多,通過 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)的字段(

16、不是字段內(nèi)容)setfield   設(shè)置結(jié)構(gòu)數(shù)組中指定的字段的值   struct   創(chuàng)建結(jié)構(gòu)數(shù)組struct2cell   結(jié)構(gòu)數(shù)組轉(zhuǎn)化成元胞數(shù)組   isfield   判斷是否存在該字段isstruct   判斷某變量是否是結(jié)構(gòu)類型    下面舉一些具體的例子說明如果對(duì)結(jié)構(gòu)數(shù)組加以操作?!纠?.3.2-1】 本例目的:一,演示函數(shù)fieldnames , getfield , setfield的使用方法;二,

17、讓讀者感受到結(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ù)描寫的LTI線性時(shí)不變2輸入2輸出系統(tǒng) 。(1)產(chǎn)生2輸入2輸出系統(tǒng)的傳遞函數(shù)陣“對(duì)象”Stf=tf(3,2;4 1,1,1 3 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 fro

18、m input 2 to output.2#1: -s2 + s + 11#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 cellVariable: 's'lti: 1x1 lti (3)獲得結(jié)構(gòu)數(shù)組SSTF的域名FN=fieldnames(SSTF) % 獲得域名元胞數(shù)組FNclass(FN)  &

19、#160;  % 檢查FN的類別 FN = 'num''den''Variable''lti'ans =cell (4)獲取SSTF.den(2,1)域的內(nèi)容FC=getfield(SSTF,'den',2,1)     % 相當(dāng)于FC=SSFT.den(2,1)FC1              &

20、#160;    % 與celldisp(FC)的作用大致相當(dāng)poly2str(FC1,'s'),         % 為了把多項(xiàng)式顯示成習(xí)慣的形式 FC = 1x4 doubleans =1 2 2 1ans =s3 + 2 s2 + 2 s + 1 (5)重新設(shè)置SSTF.num(2,1)域的內(nèi)容SSTF.num2,1          

21、       % 顯示原始情況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

22、-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 array with fields:numdenVariableltians =2 2 (3)演示結(jié)構(gòu)數(shù)組的收縮:刪除結(jié)構(gòu)數(shù)組的第1行SSTF(1,=  &

23、#160;                % 收縮成為 的結(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 a

24、rray with fields:numdenVariableltiS22n = 1x2 doubleS22d = 1x2 doublenum/den = 1-s + 1 【例4.3.2-3】對(duì)結(jié)構(gòu)數(shù)組進(jìn)行域的增添和刪減操作。(1)創(chuàng)建結(jié)構(gòu)數(shù)組clear,for k=1:10;department(k).number='No.',int2str(k);enddepartment department = 1x10 struct array with fields:number (2)增添域:在數(shù)組中任何一個(gè)結(jié)

25、構(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 array with fields:numberteacherstudentPC_computer (3)增添子域的操作只影響被操作的那個(gè)具體結(jié)構(gòu),而不是影響整個(gè)結(jié)構(gòu)數(shù)組department(2).teacher.male=35;department(2).teacher.female=13;

26、D2T=department(2).teacher     % 第2結(jié)構(gòu)teacher域包含兩個(gè)子域D1T=department(1).teacher     % 第1結(jié)構(gòu)teacher域僅是一個(gè)數(shù) D2T = male: 35female: 13D1T =40 (4)刪除子域的操作也只影響被操作的那個(gè)具體結(jié)構(gòu)department(2).teacher=rmfield(department(2).teacher,'male');department(2).teacher

27、 ans = female: 13 (5)刪除域的操作是對(duì)整個(gè)結(jié)構(gòu)數(shù)組實(shí)施的department=rmfield(department,'student')   % 刪除一個(gè)域 department = 1x10 struct array with fields:numberteacherPC_computer department=rmfield(department,'teacher''PC_computer')% 刪除2個(gè)域 department =&

28、#160;1x10 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)建1×5結(jié)構(gòu)數(shù)組ex(k).f = (k-1)*n_ex + 1:5;end;ex                     

29、60;     % 顯示結(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 19 2021 22 23 24 25 class(ex(1).f)       

30、;            % 檢查域中內(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

31、),end ex.f的平方根值1.0000 1.4142 1.7321 2.0000 2.23612.4495 2.6458 2.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.' int

32、2str(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)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    

33、%顯示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è)域的(1×5)結(jié)構(gòu)數(shù)組轉(zhuǎn)換為(2×1×5)元胞數(shù)組size(C_ex)fprintf('%s',C_ex1,1,1,blanks(3)   % 顯示C_ex第1頁(yè)

34、第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)      %

35、 元胞數(shù)組向結(jié)構(gòu)數(shù)組轉(zhuǎn)換 EX1 = 1x5 struct array with fields:S_charF_numric EX1(1)                   % 觀察新結(jié)構(gòu)EX1第一結(jié)構(gòu)的情況 ans = S_char: 'No.1'F_numric: 1 2 3 4 5 (5)把元胞數(shù)組轉(zhuǎn)換為結(jié)構(gòu)數(shù)組之二EX2=cell2

36、struct(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,YY,3) EX3 = 2x1 struct array with fields:y1y2y3y4y5 EX3(1)     &

37、#160;             % 觀察第一結(jié)構(gòu)情況 ans = y1: 'No.1'y2: 'No.2'y3: 'No.3'y4: 'No.4'y5: 'No.5' EX3(2)               

38、60;   % 觀察第二結(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é)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論