《MATLAB基礎(chǔ)與編程入門》課件第3章_第1頁(yè)
《MATLAB基礎(chǔ)與編程入門》課件第3章_第2頁(yè)
《MATLAB基礎(chǔ)與編程入門》課件第3章_第3頁(yè)
《MATLAB基礎(chǔ)與編程入門》課件第3章_第4頁(yè)
《MATLAB基礎(chǔ)與編程入門》課件第3章_第5頁(yè)
已閱讀5頁(yè),還剩164頁(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)介

第三章數(shù)據(jù)類型3.1概述3.2MATLAB基本數(shù)值類型3.3邏輯類型和關(guān)系運(yùn)算3.4字符串3.5元胞數(shù)組3.6結(jié)構(gòu)3.7本章小結(jié)3.1概述MATLAB的早期版本只有非常簡(jiǎn)單的二維數(shù)組和字符類型的數(shù)據(jù),目前的MATLAB版本中不僅有多達(dá)十幾種的基本數(shù)據(jù)類型,在不同的專業(yè)工具箱中還有特殊的數(shù)據(jù)類型,并且MATLAB還支持面向?qū)ο蟮木幊碳夹g(shù),支持用戶自定義的數(shù)據(jù)類型。

MATLAB支持的基本數(shù)據(jù)類型見圖3-1。圖3-1MATLAB的數(shù)據(jù)類型

獲取MATLAB的數(shù)據(jù)類型列表可以在MATLAB命令行窗口中鍵入helpdatatypes命令。在圖3-1中所示的各種數(shù)據(jù)類型都可以用于創(chuàng)建向量、矩陣或者多維數(shù)組。用戶自定義的數(shù)據(jù)類型也是圖示的各種數(shù)據(jù)類型的組合。在不同的MATLAB工具箱中具有自定義的數(shù)據(jù)類型,例如控制系統(tǒng)工具箱中定義的LTI對(duì)象,在濾波器設(shè)計(jì)工具箱中定義的濾波器對(duì)象,在符號(hào)數(shù)學(xué)工具箱中定義的符號(hào)類型數(shù)據(jù)等。這些工具箱中包含的特殊數(shù)據(jù)對(duì)象也都使用這些基本的數(shù)據(jù)類型組合構(gòu)成。

需要指出一點(diǎn),MATLAB的基本數(shù)據(jù)類型是雙精度數(shù)據(jù)類型和字符類型。MATLAB的M語(yǔ)言和其他高級(jí)編程語(yǔ)言不同的是,MATLAB沒有具體的變量或?qū)ο舐暶骱投x過程,任何數(shù)據(jù)類型的變量或?qū)ο蠖伎梢岳妹嫦驅(qū)ο缶幊碳夹g(shù)中構(gòu)造函數(shù)的方法或者數(shù)據(jù)類型轉(zhuǎn)換的方法來(lái)創(chuàng)建其他數(shù)據(jù)類型對(duì)象和變量。MATLAB和Java語(yǔ)言、C++語(yǔ)言類似,所有數(shù)據(jù)類型就是相應(yīng)的類,具有一定的面向?qū)ο蟮奶攸c(diǎn)。MATLAB的不同數(shù)據(jù)類型的變量或?qū)ο笳加玫膬?nèi)存空間不盡相同,不同的數(shù)據(jù)類型的變量或?qū)ο笠簿哂胁煌牟僮骱瘮?shù)。在本章中,將詳細(xì)講述MATLAB的基本數(shù)值類型、邏輯類型、字符串、元胞數(shù)組和結(jié)構(gòu)的使用方法,其中,元胞數(shù)組是MATLAB中常用的一種獨(dú)有的數(shù)據(jù)類型。3.2MATLAB基本數(shù)值類型3.2.1基本數(shù)值類型入門表3-1MATLAB的基本數(shù)值類型

說(shuō)明:表格中所指的字節(jié)數(shù)是指使用該數(shù)據(jù)類型創(chuàng)建數(shù)組或者矩陣時(shí),每一個(gè)元素占用的內(nèi)存字節(jié)數(shù),稀疏矩陣則不同,由于稀疏矩陣使用了特殊的存儲(chǔ)數(shù)據(jù)方法,所以稀疏矩陣對(duì)象占用的內(nèi)存字節(jié)數(shù)比較特殊。復(fù)數(shù)數(shù)據(jù)類型也相對(duì)特殊,復(fù)數(shù)可以用表格中所示的各種數(shù)據(jù)類型創(chuàng)建,但是由于復(fù)數(shù)由實(shí)部數(shù)據(jù)和虛部數(shù)據(jù)組成,所以占用的字節(jié)數(shù)為構(gòu)成復(fù)數(shù)的數(shù)據(jù)類型的兩倍,例如復(fù)數(shù)z=1+i,在MATLAB中占用了16個(gè)字節(jié)的內(nèi)存。例子3-1

使用不同的數(shù)據(jù)類型。在MATLAB命令行窗口中,鍵入下面的指令:>>A=[123];>>class(A)ans=double>>whosNameSizeBytesClassA1x324doublearrayans1x612chararrayGrandtotalis9elementsusing36bytes>>B=int16(A);>>class(B)ans=int16>>whosNameSizeBytesClassA1x324doublearrayB1x36int16arrayans1x510chararray

在例子3-1中,使用了int16,即16位的有符號(hào)整數(shù)類型,作為示例,并且使用class函數(shù)獲取不同變量或者對(duì)象的數(shù)據(jù)類型。向量B是從向量A通過數(shù)據(jù)類型轉(zhuǎn)換得到的,可以看出,A和B向量包含同樣的數(shù)據(jù),但是由于兩個(gè)向量的數(shù)據(jù)類型不同,所以它們占據(jù)的內(nèi)存字節(jié)數(shù)不同,其中雙精度類型的向量A占用了24個(gè)字節(jié),而16位整數(shù)類型的向量B僅占用了6個(gè)字節(jié)。注意:

MATLAB和C語(yǔ)言在處理數(shù)據(jù)類型和變量時(shí)不同。在C語(yǔ)言中,任何變量在使用之前都必須聲明,然后賦值,在聲明變量時(shí)就指定了變量的數(shù)據(jù)類型。但是在MATLAB中,任何數(shù)據(jù)變量都不需要預(yù)先的聲明,MATLAB將自動(dòng)地將數(shù)據(jù)類型設(shè)置為雙精度類型,若需要使用其他類型的數(shù)據(jù),則必須通過數(shù)據(jù)類型的轉(zhuǎn)換完成。MATLAB的數(shù)據(jù)類型名稱同樣就是數(shù)據(jù)類型轉(zhuǎn)換的函數(shù),利用這些函數(shù)來(lái)完成相應(yīng)的數(shù)據(jù)類型轉(zhuǎn)化的工作。關(guān)于數(shù)據(jù)類型轉(zhuǎn)換函數(shù)的使用可以參閱相應(yīng)的在線幫助。例子3-2

使用不同的數(shù)據(jù)類型。在MATLAB命令行窗體中鍵入下面的指令:>>A=[123];>>B=[456];>>C=A+B;>>whosNameSizeBytesClassAttributesA1x324doubleB1x324doubleC1x324double>>D=int16(A)+int16(B)D=579>>whosNameSizeBytesClassAttributesA1x324doubleB1x324doubleC1x324doubleD1x36int16>>E=C+D???Errorusing==>plusIntegerscanonlybecombinedwithintegersofthesameclass,orscalardoubles.3.2.2整數(shù)類型數(shù)據(jù)運(yùn)算

MATLAB運(yùn)算的基本數(shù)據(jù)類型為雙精度的數(shù)據(jù)類型,MATLAB還另外提供了一些函數(shù)可以進(jìn)行整數(shù)類型數(shù)據(jù)的運(yùn)算,在表3-2中總結(jié)了這些函數(shù)。表3-2整數(shù)類型數(shù)據(jù)的運(yùn)算函數(shù)

注意:整數(shù)類型數(shù)據(jù)運(yùn)算函數(shù)的操作數(shù)一般為無(wú)符號(hào)的整數(shù),不同的函數(shù)會(huì)有所不同,函數(shù)運(yùn)算的結(jié)果必須小于bitmax代表的數(shù)值。提示:數(shù)據(jù)位運(yùn)算了解計(jì)算機(jī)中數(shù)據(jù)的二進(jìn)制表達(dá)是進(jìn)行二進(jìn)制位運(yùn)算的基礎(chǔ)。在計(jì)算機(jī)中的任何數(shù)據(jù)都是由二進(jìn)制數(shù)來(lái)保存的,計(jì)算機(jī)最初能夠處理的也只有二進(jìn)制的數(shù)據(jù)。對(duì)于整數(shù)可以使用原碼、反碼、補(bǔ)碼來(lái)表示。

字節(jié)和位字節(jié)這個(gè)概念對(duì)于計(jì)算機(jī)用戶來(lái)講并不陌生,計(jì)算機(jī)中的存儲(chǔ)器就是由許許多多被稱為“字節(jié)”(byte)的單元組成的。一般地,內(nèi)存的最小度量單位是位(bit),有些地方叫作比特。而一個(gè)字節(jié)就是由8個(gè)二進(jìn)制位組成的,其中,最右邊的一位叫最低位,最左邊的一位叫作最高位。所以在本章前面小節(jié)介紹的16位整數(shù)占用兩個(gè)字節(jié)的內(nèi)存,依次類推,32位整數(shù)就需要占用四個(gè)字節(jié)的內(nèi)存。在計(jì)算機(jī)中表示數(shù)據(jù)可以有不同的方法,一般有原碼、反碼和補(bǔ)碼三種形式。為了便于表述,這里所有的數(shù)字都將按照數(shù)字在八位計(jì)算機(jī)內(nèi)的表示方式來(lái)表示。

原碼將最高位作為符號(hào)位(以數(shù)字0表示正,以數(shù)字1表示負(fù)),其他的數(shù)字位代表數(shù)值本身的絕對(duì)值,這種表示數(shù)字的方式叫作原碼。例如,數(shù)字7在八位計(jì)算機(jī)中的原碼為00000111;而數(shù)字-7在八位計(jì)算機(jī)中的原碼為10000111。如果這兩個(gè)數(shù)字在我們?nèi)粘J褂玫?2位計(jì)算機(jī)中用原碼表示,則無(wú)非再多幾個(gè)數(shù)字0。例如在32位的計(jì)算機(jī)中用原碼表示數(shù)字7,則為00000000000000000000000000000111。

反碼用反碼表示數(shù)字的規(guī)則是,如果是正數(shù),則用這個(gè)數(shù)字的原碼來(lái)表示,如果是負(fù)數(shù),則保持符號(hào)位為1,然后將這個(gè)數(shù)字的原碼按照每位取反,得到這個(gè)數(shù)字的反碼。例如,數(shù)字7在八位計(jì)算機(jī)中的反碼就是它的原碼,為0000111;而數(shù)字-7在八位計(jì)算機(jī)中的反碼是11111000。

補(bǔ)碼計(jì)算機(jī)中表示數(shù)據(jù)的一般方式是補(bǔ)碼,補(bǔ)碼是這樣規(guī)定的:一個(gè)正數(shù)的補(bǔ)碼就是其原碼,例如整數(shù)7在八位計(jì)算機(jī)中的補(bǔ)碼是00000111。對(duì)于負(fù)數(shù)的補(bǔ)碼是將數(shù)字的反碼加上1,就得到了這個(gè)數(shù)字的補(bǔ)碼。例如-7在8位計(jì)算機(jī)中的補(bǔ)碼是11111001。關(guān)于數(shù)字在計(jì)算機(jī)中二進(jìn)制表示的詳細(xì)解釋請(qǐng)參閱相應(yīng)的計(jì)算機(jī)原理方面的書籍。MATLAB整數(shù)類型數(shù)據(jù)運(yùn)算和C語(yǔ)言整數(shù)位運(yùn)算比較類似,所不同的是MATLAB中沒有相應(yīng)的運(yùn)算符,而只有這些函數(shù)可用,并且這些整數(shù)運(yùn)算的數(shù)據(jù)都必須大于0。這里結(jié)合具體的示例講解表3-2所列函數(shù)的用法。例子3-3(a)

數(shù)據(jù)位“與”操作。在MATLAB命令行窗口中,鍵入下面的指令:>>A=86;B=77;>>C=bitand(A,B)C=68>>a=uint16(A);b=uint16(B);>>c=bitand(a,b)c=68>>whosNameSizeBytesClassA 1x1 8doublearrayB 1x1 8doublearrayC 1x1 8doublearraya 1x1 2uint16arrayb 1x1 2uint16arrayc 1x1 2uint16array

請(qǐng)讀者注意例子3-3(a)運(yùn)算得到結(jié)果的數(shù)據(jù)類型,數(shù)據(jù)a、b為無(wú)符號(hào)的16位整數(shù),所以進(jìn)行操作的結(jié)果也是無(wú)符號(hào)的16位整數(shù),但數(shù)據(jù)A、B為雙精度類型的數(shù)據(jù)(注意這些數(shù)據(jù)都是非負(fù)整數(shù)),結(jié)果運(yùn)算的結(jié)果是雙精度類型。運(yùn)算的過程大體如下:例子3-3(b)

整數(shù)數(shù)據(jù)位的運(yùn)算。在MATLAB命令行窗口中,鍵入下面的指令:>>A=86;>>dec2bin(A)ans=1010110>>B=bitset(A,6);>>dec2bin(B)ans=1110110>>C=bitset(A,7,0);>>dec2bin(C)ans=10110>>D=bitshift(A,-4);>>dec2bin(D)ans=10101100000>>E=bitshift(A,-4);>>dec2bin(E)ans=101>>a=uint16(A);>>e=bitshift(A,-4);>>dec2bin(e)ans=101>>whosNameSizeBytesClassA 1x1 8doublearrayB 1x1 8doublearrayC 1x1 8doublearrayD 1x1 8doublearrayE 1x1 8doublearraya 1x1 2uint16arrayans1x3 6chararraye 1x1 8doublearray

說(shuō)明:

dec2bin函數(shù)是將十進(jìn)制整數(shù)轉(zhuǎn)變成二進(jìn)制整數(shù)字符串的函數(shù),該函數(shù)將在本章3.4.4字符串轉(zhuǎn)換函數(shù)一節(jié)詳細(xì)講述。在例子3-3(b)中,使用了bitset函數(shù)和bitshift函數(shù),其中bitshift函數(shù)類似于C語(yǔ)言的“>>”運(yùn)算符和“<<”運(yùn)算符,如果函數(shù)輸入的第二個(gè)參數(shù)為正數(shù),則進(jìn)行左位移操作,否則為右位移操作。bitset函數(shù)根據(jù)輸入的第二個(gè)參數(shù)設(shè)置相應(yīng)的數(shù)據(jù)位的數(shù)值,若不指定第三個(gè)參數(shù),則將相應(yīng)的數(shù)據(jù)位設(shè)置為“1”,否則根據(jù)輸入的第三個(gè)參數(shù)(0或者1)設(shè)置相應(yīng)的數(shù)據(jù)位。另外,注意一些函數(shù)運(yùn)算的結(jié)果,有些函數(shù)的運(yùn)算結(jié)果是雙精度數(shù)據(jù)類型。3.2.3MATLAB的常量表3-3MATLAB的常量

說(shuō)明:

eps、realmax和realmin三個(gè)常量具體的數(shù)值與運(yùn)行MATLAB的計(jì)算機(jī)相關(guān),不同的計(jì)算機(jī)系統(tǒng)可能具有不同的數(shù)值,例如,在筆者的計(jì)算機(jī)上,這三個(gè)數(shù)值分別為eps=2.2204×10-16,realmax=1.7977×10308,realmin=2.2251×10-308。和其他的高級(jí)編程語(yǔ)言所定義的常量不同,MATLAB的常量數(shù)值是可以修改的。例如,在MATLAB命令行窗口中可以鍵入如下的指令:pi=100,這樣pi這個(gè)常量的數(shù)值就變成了100。但是,如果用clear指令清除變量后,pi將變成原有的常量數(shù)值。Inf也可以寫作inf,它為IEEE定義的算術(shù)數(shù)據(jù)無(wú)窮大數(shù)值,在MATLAB中進(jìn)行諸如1.0/0.0或者exp(1000)的操作時(shí)都會(huì)得到這個(gè)數(shù)值。如果將inf應(yīng)用于函數(shù),則計(jì)算結(jié)果可能為inf或者NaN。

NaN也可以寫作nan,它為IEEE規(guī)定的某種運(yùn)算得到的結(jié)果,例如0/0的運(yùn)算得到的結(jié)果就是NaN。NaN參與運(yùn)算的結(jié)果也為NaN(關(guān)系運(yùn)算除外)。例子3-4NaN和Inf運(yùn)算示例。在MATLAB命令行窗口中,鍵入下面的指令:>>a=inf;>>class(a)ans=double>>b=int16(a)b=32767>>c=sin(a)c=NaN>>sin(c)ans=NaN>>class(c)ans=double>>int64(c)ans=0

說(shuō)明:

MATLAB中所有的數(shù)據(jù)默認(rèn)類型均為雙精度類型,包括像NaN和Inf在內(nèi)的上述若干常數(shù)。對(duì)NaN和Inf進(jìn)行數(shù)據(jù)轉(zhuǎn)化時(shí)要注意,Inf將獲取相應(yīng)數(shù)據(jù)類型的最大值,而NaN往往返回相應(yīng)整數(shù)數(shù)據(jù)類型的數(shù)值0,浮點(diǎn)數(shù)類型則仍然為NaN。在運(yùn)算中使用NaN可以避免因?yàn)閳?zhí)行了0/0這類能夠產(chǎn)生錯(cuò)誤的應(yīng)用程序中斷,可以輔助調(diào)試應(yīng)用程序。例子3-5

最小復(fù)數(shù)單位的使用。在MATLAB命令行窗口中,鍵入下面的指令:>>a=ia=0+1.0000i>>i=1i=1>>b=i+jb=1.0000+1.0000i>>clear>>c=i+jc=0+2.0000i

通過例子3-5可以看出,MATLAB的常量是可以賦予新的數(shù)值的。一旦被賦予了新的數(shù)值,則常量代表的就不是原有的數(shù)值,而是新的數(shù)值,除非執(zhí)行clear命令。就像創(chuàng)建變量c的時(shí)候,由于執(zhí)行了clear指令,將工作空間中的變量清除干凈,于是在執(zhí)行c=i+j的時(shí)候,MATLAB認(rèn)為這是在進(jìn)行兩個(gè)最小復(fù)數(shù)運(yùn)算單位的計(jì)算,所以得到了c=2i。3.2.4空數(shù)組所謂空數(shù)組,就是指那些某一個(gè)維或者某些維的長(zhǎng)度為0的數(shù)組。它是為了完成某些MATLAB操作和運(yùn)算而專門設(shè)計(jì)的一種數(shù)組。利用空數(shù)組可以修改數(shù)組的大小,但是不能修改數(shù)組的維數(shù)。下面通過具體的例子來(lái)說(shuō)明空數(shù)組創(chuàng)建和使用的過程。

[例子3-6]

創(chuàng)建空數(shù)組。和創(chuàng)建普通的數(shù)組(矩陣)一樣,創(chuàng)建空數(shù)組也有不同的方法,在MATLAB命令行窗口中鍵入下面的命令:>>A=[]A=[]>>B=ones(2,3,0)B=Emptyarray:2-by-3-by-0>>C=randn(2,3,4,0)C=Emptyarray:2-by-3-by-4-by-0>>whosName SizeBytesClassA 0x0 0doublearrayB 2x3x0 0doublearrayC 4-D 0doublearray

空數(shù)組并不意味著什么都沒有,使用whos命令可以看到空數(shù)組類型的變量在MATLAB的工作空間中確實(shí)存在。在數(shù)組編輯器中也可以對(duì)空數(shù)組進(jìn)行編輯,填充矩陣的元素。圖3-2為空數(shù)組在數(shù)組編輯器中顯示的狀況。圖3-2空數(shù)組在數(shù)組編輯器中的顯示情況例子3-7

使用空數(shù)組的例子。在MATLAB命令行窗口中,鍵入下面的指令:>>A(2,2,3)=1A(:,:,1)=0000A(:,:,2)=0000A(:,:,3)=0001>>A(:,:,3)=[]A(:,:,1)=0000A(:,:,2)=0000>>B=reshape(1:24,4,6)B=159131721261014182237111519234812162024>>B(:,[234])=[]B=117212182231923420243.3邏輯類型和關(guān)系運(yùn)算3.3.1邏輯數(shù)據(jù)類型所謂邏輯數(shù)據(jù)類型就是僅具有兩個(gè)數(shù)值的一種數(shù)據(jù)類型,其中,一個(gè)數(shù)值為TRUE,另外一個(gè)數(shù)值為FALSE。在MATLAB中,參與邏輯運(yùn)算或者關(guān)系運(yùn)算的并不一定必須有邏輯類型的數(shù)據(jù),任何數(shù)值都可以參與邏輯運(yùn)算。這時(shí),MATLAB將所有非零值看作邏輯真,將零值看作邏輯假。一般地,1表示邏輯真,0表示邏輯假。和一般的數(shù)值類型類似,邏輯類型的數(shù)據(jù)只能通過數(shù)值類型轉(zhuǎn)換,或者使用特殊的函數(shù)生成相應(yīng)類型的數(shù)組或者矩陣。表3-4創(chuàng)建邏輯類型數(shù)據(jù)的函數(shù)例子3-8

創(chuàng)建邏輯類型數(shù)組。在MATLAB命令行窗口中,鍵入下面的指令:>>A=eye(3);>>B=logical(A)B=100010001>>C=true(size(A))C=111111111>>D=false([size(A),2])D(:,:,1)=000000000D(:,:,2)=000000000>>whosNameSizeBytesClassA3x3 72doublearrayB3x3 9logicalarrayC3x3 9logicalarrayD3x3x2 18logicalarray

使用logical函數(shù)、true函數(shù)和false函數(shù)的過程都比較簡(jiǎn)單,通過最后的比較可以看出,邏輯類型的數(shù)組每一個(gè)元素僅占用一個(gè)字節(jié)的內(nèi)存空間,所以矩陣B盡管和矩陣A看上去一致,但是內(nèi)存占用上有相當(dāng)大的差距,并且屬于不同的數(shù)據(jù)類型,也就有不同的操作函數(shù)和方法。注意:本書將MATLAB的logicalarray(邏輯數(shù)組)稱為邏輯類型的數(shù)組。在有些書籍上,將MATALB的這種數(shù)據(jù)類型直接叫做布爾類型數(shù)組,請(qǐng)讀者注意對(duì)比。

邏輯類型的數(shù)組元素僅能有兩個(gè)取值:1或者0,分別表示邏輯真和邏輯假。另外,在MATLAB中還有若干函數(shù)以is開頭,這類函數(shù)是用來(lái)完成某種判斷功能的函數(shù),例如函數(shù)isnan判斷輸入?yún)?shù)是否為NaN,而isnumeric函數(shù)判斷輸入?yún)?shù)是否為某種數(shù)值類型,見例子3-9。例子3-9isnumeric函數(shù)的使用示例。在MATLAB命令行窗口中,鍵入下面的指令:>>a=truea=1>>isnumeric(a)ans=0>>b=1;>>isnumeric(b)ans=1

注意:在使用true或者false函數(shù)創(chuàng)建邏輯類型數(shù)組時(shí),若不指明參數(shù),則創(chuàng)建一個(gè)邏輯類型的標(biāo)量。此外,能夠產(chǎn)生邏輯數(shù)據(jù)類型結(jié)果的運(yùn)算還有關(guān)系運(yùn)算,關(guān)系運(yùn)算將在3.3.3小節(jié)詳細(xì)討論。3.3.2邏輯運(yùn)算表3-5MATLAB的邏輯運(yùn)算

說(shuō)明:參與邏輯運(yùn)算的操作數(shù)不一定必須是邏輯類型的變量或常數(shù),也可以使用其他類型的數(shù)據(jù)進(jìn)行邏輯運(yùn)算,但是運(yùn)算的結(jié)果一定是邏輯類型的數(shù)據(jù)。所謂具有短路作用是指,在進(jìn)行&&或||運(yùn)算時(shí),若參與運(yùn)算的變量有多個(gè),例如a&&b&&c&&d,若a、b、c、d四個(gè)變量中a為假,則后面的三個(gè)都不再被處理,運(yùn)算結(jié)束,并返回運(yùn)算結(jié)果邏輯假。例子3-10

邏輯運(yùn)算示例。在MATLAB命令行窗口中,鍵入下面的指令:>>a=eye(3);>>b=a;b(3,1)=1;>>a&&b???Operandstothe||and&&operatorsmustbeconvertibletologicalscalarvalues.>>a&bans=100010001>>whosName SizeBytesClassa 3x372doublearrayans 3x39logicalarrayb 3x372doublearrayGrandtotalis27elementsusing153bytes

例子3-10中,首先參與邏輯運(yùn)算的是兩個(gè)雙精度類型的矩陣,這兩個(gè)矩陣進(jìn)行&&運(yùn)算時(shí),MATLAB報(bào)告了相應(yīng)的錯(cuò)誤,因?yàn)閰⑴c&&或者||運(yùn)算的操作數(shù)必須為標(biāo)量。另外,從例子也能夠看出,盡管參與運(yùn)算的是兩個(gè)雙精度類型的矩陣,運(yùn)算的結(jié)果卻是邏輯類型的矩陣。例子3-11

函數(shù)all和any使用示例。在MATLAB命令行窗口中,鍵入下面的指令:>>a=[101;100;110;111]a=101100110111>>all(a)ans= 100>>any(a)ans= 1113.3.3關(guān)系運(yùn)算關(guān)系運(yùn)算是用來(lái)判斷兩個(gè)操作數(shù)關(guān)系的運(yùn)算,MATLAB中的關(guān)系運(yùn)算和C語(yǔ)言的關(guān)系運(yùn)算基本一致,主要有六種,見表3-6。表3-6MATLAB中的關(guān)系運(yùn)算符

參與關(guān)系運(yùn)算的操作數(shù)可以使用各種數(shù)據(jù)類型的變量或者常數(shù),運(yùn)算的結(jié)果是邏輯類型的數(shù)據(jù)。標(biāo)量也可以和矩陣或者數(shù)組進(jìn)行比較,比較的時(shí)候?qū)⒆詣?dòng)擴(kuò)展標(biāo)量,返回的結(jié)果是和數(shù)組同維的邏輯類型數(shù)組。如果進(jìn)行比較的是兩個(gè)數(shù)組,則數(shù)組必須是同維的,且每一維的尺寸也必須一致。例子3-12關(guān)系運(yùn)算示例。在MATLAB命令行窗口中,鍵入下面的指令:>>A=reshape(1:9,3,3);>>B=magic(3);>>A>Bans=011001001>>A==Bans=000010000例子3-13

復(fù)雜的關(guān)系運(yùn)算。在MATLAB命令行窗口中,鍵入下面的指令:>>A=reshape(-4:4,3,3)A=-4-12-303-214>>B=~(A>=0)B=110100100>>C=(A>0)&(A<3)C=001000010

在例子3-13中,使用邏輯運(yùn)算和關(guān)系運(yùn)算從矩陣A中分別標(biāo)識(shí)出不大于0的數(shù)據(jù)和大于0且小于3的數(shù)據(jù)索引位置。將邏輯類型的數(shù)據(jù)應(yīng)用于索引就構(gòu)成了邏輯索引,利用邏輯索引,可以方便地從矩陣或者數(shù)組中找到某些符合條件的元素,見例子3-14。例子3-14

邏輯索引示例。在MATLAB命令行窗口中,鍵入下面的指令:>>A=[-210NaN300-11-Inf31];>>pos=A<0pos=10000110>>B=A(pos)B=-2-11-Inf>>pos=(A>=0)&(isfinite(A))pos=01011001>>C=A(pos)C=1030031

在例子3-13中,首先從向量A中獲取了全部小于0的元素構(gòu)成向量B,然后從向量A中獲取了不小于0且有窮的向量元素??梢钥闯?,邏輯索引數(shù)組可以非常方便地獲取數(shù)組中滿足條件的元素,這種操作在處理大數(shù)組時(shí)非常有效。3.3.4運(yùn)算符的優(yōu)先級(jí)到本小節(jié)為止,MATLAB的基本運(yùn)算符都已經(jīng)介紹完畢了。在M語(yǔ)言中可以將這些不同的運(yùn)算符組合起來(lái)創(chuàng)建復(fù)雜的運(yùn)算表達(dá)式。M語(yǔ)言的運(yùn)算符和普通的高級(jí)編程語(yǔ)言類似,也具有相應(yīng)的計(jì)算優(yōu)先級(jí)。這里將M語(yǔ)言的運(yùn)算以及相應(yīng)的計(jì)算優(yōu)先級(jí)進(jìn)行了總結(jié):

(1)括號(hào)()。

(2)數(shù)組轉(zhuǎn)置(.'),數(shù)組冪(.^),復(fù)轉(zhuǎn)置('),矩陣冪(^)。

(3)一元加(+),一元減(?),邏輯非(~)。

(4)數(shù)組乘法(.*),數(shù)組除法(./),數(shù)組左除(.\),矩陣乘法(*),矩陣右除(/),矩陣左除(\)。

(5)加法(+),減法(?)。(6)冒號(hào)運(yùn)算符(:)。

(7)小于(<),小于等于(<=),大于(>),大于等于(>=),等于(==),不等于(~=)。(8)元素與(&)。(9)元素或(|)。(10)短路邏輯與(&&)。(11)短路邏輯或(||)。

上面的運(yùn)算符優(yōu)先級(jí)是由高到低排列的,例如括號(hào)運(yùn)算符的優(yōu)先級(jí)最高,數(shù)組轉(zhuǎn)置等次之。如果同一級(jí)別的運(yùn)算符出現(xiàn)在表達(dá)式中,則按照運(yùn)算符在表達(dá)式中出現(xiàn)的次序,由左向右排列。在使用M語(yǔ)言編寫程序時(shí),需要靈活使用這些運(yùn)算符來(lái)具體實(shí)現(xiàn)不同的算法。3.4字符串3.4.1字符串入門例子3-15字符串的創(chuàng)建。在MATLAB命令行窗口中,鍵入下面的指令:>>a=127a=127>>class(a)ans=double>>size(a)ans=11>>b='127'b=127>>class(b)ans=char>>size(b)ans=13>>whosName SizeBytesClassa 1x18doublearrayans 1x216doublearrayb 1x36chararrayGrandtotalis6elementsusing30bytes

創(chuàng)建字符串時(shí),只要將字符串的內(nèi)容用單引號(hào)包含起來(lái)就可以了,若需要在字符串內(nèi)容中包含單引號(hào),則需要在鍵入字符串內(nèi)容時(shí),連續(xù)鍵入兩個(gè)單引號(hào)即可,例如>>c='Isn''tit?'c=Isn'tit?

另外,使用char函數(shù)可以創(chuàng)建一些無(wú)法通過鍵盤輸入的字符,該函數(shù)的作用是將輸入的整數(shù)參數(shù)轉(zhuǎn)變成為相應(yīng)的字符,一般地轉(zhuǎn)換成為相應(yīng)的Unicode字符。同樣字符串也可以轉(zhuǎn)變成為相應(yīng)的雙精度數(shù)據(jù)。關(guān)于char函數(shù)的使用將在后續(xù)章節(jié)中講述。

關(guān)于Unicode

設(shè)計(jì)Unicode的主要目的是為了簡(jiǎn)化對(duì)非羅馬語(yǔ)系字符的處理。依照Unicode設(shè)計(jì)的宗旨,Unicode將對(duì)世界上所有語(yǔ)言的字符進(jìn)行控制,所以,Unicode占用了兩個(gè)字節(jié),也就是說(shuō)Unicode可以表示65536個(gè)字符。同用單個(gè)字節(jié)表示字符的ASCII/ANSI字符相比,Unicode字符集的容量大了很多,而且,ASCII/ANSI字符集是Unicode的子集,Unicode字符集的前256個(gè)字符就是ASCII字符。目前已經(jīng)有阿拉伯文、中文拼音、俄文、希臘文等多種語(yǔ)言定義了Unicode代碼點(diǎn),總計(jì)約有35000個(gè),還有約29000個(gè)代碼點(diǎn)等待分配,此外,還有約6000個(gè)代碼點(diǎn)供個(gè)人使用。開發(fā)應(yīng)用程序時(shí)考慮使用Unicode的主要原因是:●可以比較容易地在不同語(yǔ)言之間交換數(shù)據(jù)?!窨梢允棺约壕帉懙亩M(jìn)制文件支持所有的語(yǔ)言版本?!裉岣邞?yīng)用程序的運(yùn)行效率。目前,在Windows2000和WindowsXP等操作系統(tǒng)中,所有的核心函數(shù)都要求使用Unicode字符。欲了解Unicode的詳細(xì)情況,請(qǐng)登錄網(wǎng)站。3.4.2基本字符串操作本小節(jié)詳細(xì)介紹字符串的基本操作,結(jié)合具體的例子將詳細(xì)講解字符串元素索引、字符串的拼接、字符串與數(shù)值之間的轉(zhuǎn)換等操作。例子3-16字符串元素索引。字符串實(shí)際上也是一種MATLAB的向量或者數(shù)組,所以,一般利用索引操作數(shù)組的方法都可以用來(lái)操作字符串。在MATLAB命令行窗口中,鍵入下面的指令:>>a='ThisisNo.3-15Example!'a=ThisisNo.3-15Example!>>b=a(1:4)b=This>>c=a(12:15)c=3-15>>d=a(17:end)d=Example!

本例子使用了索引獲取字符串a(chǎn)的子串,直觀上在字符串中使用索引和在數(shù)組或向量中使用索引是沒有任何區(qū)別的。字符串還可以利用“[]”運(yùn)算符進(jìn)行拼接,不過拼接字符串時(shí)需要注意以下兩點(diǎn):●若使用“,”作為不同字符串之間的間隔,則相當(dāng)于擴(kuò)展字符串成為更長(zhǎng)的字符串向量?!袢羰褂谩?;”作為不同字符串之間的間隔,則相當(dāng)于擴(kuò)展字符串成為二維或者多維的數(shù)組,這時(shí),不同行上的字符串必須具有同樣的長(zhǎng)度,見例子3-17。例子3-17

字符串的拼接。在MATLAB命令行窗口中,鍵入下面的指令:>>a='Hello';>>b='MOTO!';>>length(a)==length(b)ans=1>>c=[a,'',b]c=HelloMOTO!>>d=[a;b]d=HelloMOTO!>>size(c)ans=111>>size(d)ans=25

在例子3-16中,首先創(chuàng)建了兩個(gè)長(zhǎng)度一致的字符串,然后利用“[]”運(yùn)算符將兩個(gè)字符串分別組合成為了向量c和矩陣d。不過在創(chuàng)建矩陣d時(shí),各個(gè)行字符串必須具有相同的長(zhǎng)度。拼接字符串還可以使用部分函數(shù)完成,這些函數(shù)在3.4.3小節(jié)講述。如前文所述,在MATLAB中使用了Unicode作為字符集,所以每一個(gè)字符占用了兩個(gè)字節(jié)的存儲(chǔ)空間。字符串和一般的數(shù)值之間也可以進(jìn)行相應(yīng)的轉(zhuǎn)換,在例子3-18中,將使用字符向數(shù)值轉(zhuǎn)換的方法察看相應(yīng)字符的Unicode數(shù)值。例子3-18字符串和數(shù)值的轉(zhuǎn)換。在MATLAB命令行窗口中,鍵入下面的指令:>>a='HelloMOTO!';>>b=double(a)b=Columns1through872101108108111327779Columns9through11847933>>c='您好!';>>d=double(c)d=504264781141889>>char(d)ans=您好!3.4.3字符串操作函數(shù)表3-7常用的字符串操作函數(shù)例子3-19

組合字符串示例。在MATLAB命令行窗口中,鍵入下面的指令:>>a='Hello';>>b='MOTO!';>>c=strcat(a,b)c=HelloMOTO!>>d=strvcat(a,b,c)d=HelloMOTO!HelloMOTO!>>whosNameSizeBytesClassa1x510chararrayb1x510chararrayc1x1020chararrayd3x1060chararrayGrandtotalis50elementsusing100bytes

在例子3-19中,使用strcat函數(shù)和strvcat函數(shù)進(jìn)行了字符串的組合。其中,與前一小節(jié)介紹的字符串組合不同,strvcat函數(shù)允許將不同長(zhǎng)度的字符串組合成為字符矩陣,并且將短字符串?dāng)U充為與長(zhǎng)字符串相同的長(zhǎng)度。例子3-20

字符串比較函數(shù)應(yīng)用示例。在MATLAB命令行窗口中,鍵入如下的指令:>>a='Thefirststring';>>b='Thesecondstring';>>c=strcmp(a,b)c=0>>d=strncmp(a,b,4)d=1>>whosNameSizeBytesClassa1x1632chararrayb1x1734chararrayc1x11logicalarrayd1x11logicalarrayGrandtotalis35elementsusing68bytes

在例子3-20中,使用兩種不同函數(shù)進(jìn)行了字符串比較,strcmp比較兩個(gè)字符串的全部字符,所以第一次比較時(shí),系統(tǒng)返回了邏輯假值,而strncmp只比較指定字符串中的前n個(gè)字符,所以在第二次比較時(shí),系統(tǒng)返回了邏輯真值。另外,使用isequal函數(shù)也可以比較兩個(gè)或兩個(gè)以上字符串是否一致。例子3-21findstr函數(shù)和strfind函數(shù)使用示例。在MATLAB命令行窗口中,鍵入下面的指令:>>S1='Afriendinneedisafriendindeed';>>S2='friend';>>a=findstr(S2,S1)a=323>>b=strfind(S2,S1)b=[]>>whosNameSizeBytesClassS11x3570chararrayS21x612chararraya1x216doublearrayb0x00doublearrayGrandtotalis43elementsusing98bytes

在例子3-21中,分別使用findstr函數(shù)和strfind函數(shù)在字符串中查尋子串的索引位置。注意兩個(gè)函數(shù)的區(qū)別,findstr函數(shù)從長(zhǎng)字符串中查尋短字符串的索引位置,而strfind是在第一個(gè)字符串參數(shù)中查尋第二個(gè)字符串參數(shù)的索引。所以,在例子3-21中兩次操作獲取了不同的運(yùn)算結(jié)果。3.4.4字符串轉(zhuǎn)換函數(shù)在MATLAB中允許不同類型的數(shù)據(jù)和字符串類型的數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換,這種轉(zhuǎn)換需要使用不同的函數(shù)完成。另外,同樣的數(shù)據(jù),特別是整數(shù)數(shù)據(jù)有很多種表示的格式,例如十進(jìn)制、二進(jìn)制或者十六進(jìn)制。在C語(yǔ)言中,printf函數(shù)通過相應(yīng)的格式字符串就可以輸出不同格式的數(shù)據(jù)。而在MATLAB中,則直接提供了相應(yīng)的函數(shù)完成數(shù)制的轉(zhuǎn)換。在表3-8和表3-9中,分別列舉了這些函數(shù)。表3-8數(shù)字和字符之間的轉(zhuǎn)換函數(shù)表3-9不同數(shù)值之間的轉(zhuǎn)換函數(shù)例子3-22num2str函數(shù)和str2num函數(shù)的用法示例。在MATLAB命令行窗口中,鍵入下面的指令:>>S=['12';'23'];>>A=str2num(S)A=1223>>B=str2num('1+2i')B=1.0000+2.0000i>>C=str2num('1+2i')C=1.00000+2.0000i>>D=num2str(rand(2,2),5)D=0.950130.606840.231140.48598>>whosName SizeBytesClassA 2x232doublearrayB 1x116doublearray(complex)C 1x232doublearray(complex)D 2x1976chararrayS 2x312chararrayGrandtotalis51elementsusing168bytes

在使用str2num函數(shù)時(shí)需要注意如下幾點(diǎn):●被轉(zhuǎn)換的字符串僅能包含數(shù)字、小數(shù)點(diǎn)、字符“e”或者“d”、數(shù)字的正號(hào)或者負(fù)號(hào),以及復(fù)數(shù)虛部字符“i”或者“j”,此外不可以包含其他字符?!袷褂迷撟址D(zhuǎn)換函數(shù)時(shí)需要注意空格。例如在本例子中轉(zhuǎn)換生成變量B和C時(shí)得到了不同的結(jié)果,主要原因是在變量C中,字符“1”和字符“+2i”之間存在空格,而加號(hào)“+”和數(shù)字2之間沒有空格,所以轉(zhuǎn)化的結(jié)果與生成變量B時(shí)不同,創(chuàng)建變量B的時(shí)候,在數(shù)字1、加號(hào)“+”和數(shù)字2之間都存在空格?!駷榱吮苊馍鲜鰡栴},可以使用str2double函數(shù),但是該函數(shù)僅能轉(zhuǎn)換標(biāo)量,不能轉(zhuǎn)換矩陣或者數(shù)組。例子3-23

數(shù)制轉(zhuǎn)換函數(shù)示例。在MATLAB命令行窗口中,鍵入下面的指令:>>a=255;>>h=dec2hex(a)h=FF>>b=dec2bin(a)b=11111111>>c=dec2base(a,5)c=2010>>b(end)='0';>>bin2dec(b)ans=254>>whosName SizeBytesClassa 1x18doublearrayans 1x18doublearrayb 1x816chararrayc 1x48chararrayh 1x24chararrayGrandtotalis16elementsusing44bytes

在例子3-23中,使用了部分?jǐn)?shù)制轉(zhuǎn)換的函數(shù),其中比較特殊的一個(gè)是dec2base函數(shù),它和base2dec函數(shù)類似,這兩個(gè)函數(shù)的輸入?yún)?shù)為兩個(gè),第二個(gè)參數(shù)表示相應(yīng)的數(shù)制,比如在例子3-23中調(diào)用的函數(shù),是將十進(jìn)制數(shù)據(jù)a轉(zhuǎn)變成為了五進(jìn)制數(shù)據(jù)的字符串。注意需要注意各種數(shù)制轉(zhuǎn)換函數(shù)的輸入?yún)?shù)類型和輸出參數(shù)類型,請(qǐng)仔細(xì)閱讀MATLAB的幫助文檔和本書中的例子。3.4.5格式化輸入輸出和C語(yǔ)言一致,MATLAB也能夠進(jìn)行格式化的輸入、輸出,這是一種高級(jí)編程語(yǔ)言所必備的一種能力。MATLAB繼承了標(biāo)準(zhǔn)C語(yǔ)言中用于printf函數(shù)的格式化字符,也就是說(shuō),用于C語(yǔ)言的格式化字符串都可以用于MATLAB的格式化輸出函數(shù)。在本小節(jié)將詳細(xì)講述MATLAB的格式化輸入、輸出函數(shù)的使用方法。表3-10中總結(jié)了可以應(yīng)用在格式化輸出函數(shù)的格式化字符。表3-10格式化字符

除了這些格式化字符外,MATLAB還支持那些在C語(yǔ)言中就包含的特殊字符,例如回車符、制表符等,這里就不再贅述。在MATLAB中,主要有兩個(gè)函數(shù)用來(lái)進(jìn)行格式化的輸入和輸出,這兩個(gè)函數(shù)分別為sscanf和sprintf。sscanf函數(shù)用來(lái)從字符串中獲取數(shù)據(jù),它的基本語(yǔ)法結(jié)構(gòu)為A=sscanf(s,format)A=sscanf(s,format,size)

在sscanf函數(shù)的參數(shù)中,s為包含數(shù)據(jù)的字符串,format是轉(zhuǎn)換字符串?dāng)?shù)據(jù)的格式化字符串,而size是需要轉(zhuǎn)換的字符矩陣的大小。函數(shù)的使用方法參見下面的例子。例子3-24sscanf函數(shù)的例子。在MATLAB命令行窗口中,鍵入下面的指令:>>S1='2.71833.1416';>>S2='2.7183e33.1416e3';>>S3='0248163264128';>>A=sscanf(S1,'%f')A=2.71833.1416>>B=sscanf(S2,'%e')B=1.0e+003*2.71833.1416>>C=sscanf(S3,'%d')C=0248163264128>>whosNameSizeBytesClassA 2x116doublearrayB 2x116doublearrayC 8x164doublearrayS1 1x1428chararrayS2 1x1734chararrayS3 1x2040chararrayGrandtotalis63elementsusing198bytes

在使用sscanf函數(shù)進(jìn)行格式化的輸入時(shí),需要注意輸入數(shù)據(jù)格式與格式化字符串之間的匹配,否則得到的結(jié)果可能不正確。格式化的輸出函數(shù)是sprintf函數(shù),該函數(shù)的基本語(yǔ)法如下:

s=sprintf(format,A,.........)

其中,format是格式化字符串,A為輸出的數(shù)據(jù),而s則是函數(shù)格式化得到的輸出結(jié)果,熟悉C語(yǔ)言的讀者理解sprintf函數(shù)應(yīng)該沒有任何問題。例子3-25sprintf函數(shù)的例子。在MATLAB命令行窗口中,鍵入下面的指令:>>A=1/eps;B=-eps;>>C=[65,66,67,pi];>>D=[pi,65,66,67];>>s1=sprintf('%+15.5f',A)s1=+4503599627370496.00000>>s2=sprintf('%+.5e',B)s2=-2.22045e-016>>s3=sprintf('%s%f',C)s3=ABC3.141593>>s4=sprintf('%s%f%s',D)s4=3.141593e+00065.000000BC>>whosName SizeBytesClassA 1x18doublearrayB 1x18doublearrayC 1x432doublearrayD 1x432doublearrays1 1x2346chararrays2 1x1326chararrays3 1x1224chararrays4 1x2652chararrayGrandtotalis84elementsusing228bytes

從例子3-24中可以看出,利用格式化字符串輸出數(shù)據(jù)的時(shí)候有如下幾點(diǎn)需要注意:●格式化字符串若包含了“+”,則表示在輸出的字符串中包含數(shù)據(jù)的符號(hào),如輸出字符串s1和s2時(shí)的結(jié)果?!駥?duì)于整數(shù)數(shù)值進(jìn)行格式化輸出時(shí),可以直接將向量轉(zhuǎn)變成為字符串,例如字符串s2的輸出結(jié)果?!袢绻敵龅臄?shù)據(jù)與相應(yīng)的格式化字符串不匹配,則輸出數(shù)值最常見的一種形式,如字符串s4的輸出結(jié)果。

作為編程語(yǔ)言,必須能夠和用戶的輸入進(jìn)行交互,所以MATLAB也提供了相應(yīng)的函數(shù)用來(lái)完成獲取用戶輸入數(shù)據(jù)的功能,這個(gè)函數(shù)就是input函數(shù),它的基本用法如下:A=input(prompt);A=input(prompt,'s')

其中,prompt為提示用的字符串,若具有第二個(gè)參數(shù)s,則輸入數(shù)據(jù)為字符串,否則為雙精度數(shù)據(jù),參見例子3-26。例子3-26input函數(shù)的例子。在MATLAB命令行窗口中,鍵入下面的指令:>>A=input('隨便輸入數(shù)字:')隨便輸入數(shù)字:123↙A=123>>whosNameSizeBytesClassA1x18doublearrayGrandtotalis1elementusing8bytes>>A=input('隨便輸入數(shù)字:','s')隨便輸入數(shù)字:123↙A=123>>whosNameSizeBytesClassA1x36chararrayGrandtotalis3elementsusing6bytes

注意比較兩次輸入得到的變量A數(shù)據(jù)類型可以看出,在input函數(shù)中,第二個(gè)參數(shù)若指定為s的時(shí)候,則輸入數(shù)據(jù)默認(rèn)為字符串的格式。3.5元胞數(shù)組3.5.1元胞數(shù)組的創(chuàng)建組成元胞數(shù)組的內(nèi)容可以是任意類型的數(shù)據(jù),所以創(chuàng)建元胞數(shù)組之前需要?jiǎng)?chuàng)建相應(yīng)的數(shù)據(jù)。本小節(jié)結(jié)合具體的實(shí)例講述創(chuàng)建元胞數(shù)組的方法和步驟。例子3-27(a)創(chuàng)建元胞數(shù)組。在MATLAB命令行窗口中,鍵入下面的指令:>>A={zeros(2,2,2),'Hello';17.35,1:100}A=[2x2x2double]'Hello'[17.3500][1x100double]>>B=[{zeros(2,2,2)},{'Hello'};{17.35},{1:100}]B=[2x2x2double]'Hello'[17.3500][1x100double]>>C={1}C=[1]>>C(2,2)={3}C=[1][][][3]>>isequal(A,B)ans=1>>whosName SizeBytesClassA 2x21122cellarrayB 2x21122cellarrayC 2x2144cellarrayans 1x11logicalarrayGrandtotalis243elementsusing2389bytes

創(chuàng)建元胞數(shù)組需要使用運(yùn)算符花括號(hào)——“{}”,例如在創(chuàng)建數(shù)組A的時(shí)候,使用花括號(hào)將不同類型和尺寸的數(shù)據(jù)組合在一起構(gòu)成了一個(gè)元胞數(shù)組,在這個(gè)數(shù)組中有標(biāo)量、多維數(shù)組、向量和字符串。注意創(chuàng)建數(shù)組B時(shí)使用了不同的方法,該方法是將數(shù)組的每一個(gè)元素都使用花括號(hào)括起來(lái),然后再用數(shù)組創(chuàng)建的符號(hào)方括號(hào)——“[]”將數(shù)組的元素括起來(lái),這時(shí)創(chuàng)建的數(shù)組B和前面創(chuàng)建的數(shù)組A完全一致,通過isequal函數(shù)的運(yùn)行就可以看出。還有一種創(chuàng)建元胞數(shù)組的方法,如創(chuàng)建數(shù)組C時(shí)所用的方法,MATLAB能夠自動(dòng)擴(kuò)展數(shù)組的尺寸,沒有被明確賦值的元素作為空元胞數(shù)組存在。

注意:元胞數(shù)組占用的內(nèi)存空間和元胞數(shù)組的內(nèi)容相關(guān),不同的元胞數(shù)組占用的內(nèi)存空間不盡相同。另外,在顯示元胞數(shù)組內(nèi)容時(shí),對(duì)于內(nèi)容較多的元胞,顯示的內(nèi)容為元胞的數(shù)據(jù)類型和尺寸,例如顯示數(shù)組A時(shí)的三維數(shù)組和長(zhǎng)度為100的向量。另外仔細(xì)察看例子3-27創(chuàng)建元胞數(shù)組的不同方法。一般的來(lái)說(shuō),構(gòu)成元胞數(shù)組的數(shù)據(jù)類型可以是字符串、雙精度數(shù)、稀疏矩陣、元胞數(shù)組、結(jié)構(gòu)或其他MATLAB數(shù)據(jù)類型。每一個(gè)元胞數(shù)據(jù)也可以為標(biāo)量、向量、矩陣、N維數(shù)組。

例子3-27(b)

創(chuàng)建元胞數(shù)組。在MATLAB中還有一個(gè)函數(shù)——cell可以用來(lái)創(chuàng)建元胞數(shù)組,本例子將使用這個(gè)函數(shù)創(chuàng)建元胞數(shù)組。在MATLAB命令行窗口中,鍵入下面的指令:>>A=cell(1)A={[]}>>B=cell(3,2)B=[][][][][][]>>C=cell(2,2,2)C(:,:,1)=[][][][]C(:,:,2)=[][][][]>>whosNameSizeBytesClassA1x14cellarrayB3x224cellarrayC2x2x232cellarrayGrandtotalis15elementsusing60bytescell函數(shù)的作用是用來(lái)創(chuàng)建空元胞數(shù)組,該函數(shù)可以創(chuàng)建一維、二維或者多維元胞數(shù)組,但是創(chuàng)建的數(shù)組都為空元胞。這里需要注意區(qū)別空數(shù)組和空元胞之間內(nèi)存占用的區(qū)別,從例子3-27(b)可以看出,元胞數(shù)組的每個(gè)空元胞占用四個(gè)字節(jié)的內(nèi)存空間。注意:使用cell函數(shù)創(chuàng)建空元胞數(shù)組的主要目的是為數(shù)組預(yù)先分配連續(xù)的存儲(chǔ)空間,節(jié)約內(nèi)存的占用,提高程序執(zhí)行的效率。有關(guān)空元胞數(shù)組的元胞賦值將在3.5.2小節(jié)中講述。3.5.2元胞數(shù)組的基本操作所謂元胞數(shù)組的基本操作主要包括對(duì)元胞數(shù)組元胞和元胞數(shù)據(jù)的訪問、修改,元胞數(shù)組的擴(kuò)展、收縮或者重組。和操作一般的數(shù)值數(shù)組類似,操作數(shù)值數(shù)組的函數(shù)也可以應(yīng)用在元胞數(shù)組上。本小節(jié)將結(jié)合具體的示例講述元胞數(shù)組的基本操作。例子3-28(a)元胞數(shù)組的訪問。在MATLAB命令行窗口中,鍵入下面的指令:>>A={zeros(2,2,2),'Hello';17.35,1:10};>>B=A(1,2)B='Hello'>>class(B)ans=cell>>whosName SizeBytesClassA 2x2402cellarrayB 1x170cellarrayans 1x48chararrayGrandtotalis38elementsusing480bytes例子3-28(b)元胞元素的訪問。在MATLAB命令行窗口中,鍵入下面的指令:>>A={zeros(2,2,2),'Hello';17.35,1:10};>>C=A{1,2}C=Hello>>classCans=c

溫馨提示

  • 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ù)覽,若沒有圖紙預(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)論