第一篇:Matlab學(xué)習(xí)心得系列——004. 元胞數(shù)組
004.元胞數(shù)組
矩陣只能存放若干單一類型的數(shù)據(jù),且不能存放矩陣(即矩陣元素不能是矩陣),也就是說矩陣只適合同時(shí)處理若干相同類型的數(shù)據(jù)。
Matlab編程有時(shí)需要突破這種局限,同時(shí)處理不同類型的數(shù)據(jù),或者處理更高層面的數(shù)據(jù)時(shí)需要把若干矩陣作為“元素”整體處理(當(dāng)然,如果是同樣大小的若干矩陣可以采用高一維的矩陣),就需要元胞數(shù)組了。
做個(gè)比喻的話,元胞數(shù)組就好比“櫥柜”,由若干個(gè)“抽屜”構(gòu)成,每個(gè)“抽屜”里可以存放任何“東西”(數(shù)據(jù)類型,包括矩陣)。這為Matlab編程提供了極大的方便性和靈活性。
注:矩陣的“元素”,叫做元素;元胞數(shù)組的“元素”,叫做元胞。元胞數(shù)組更準(zhǔn)確的叫法,應(yīng)該叫元胞矩陣。
一、元胞數(shù)組的創(chuàng)建
三種方法:
1.直接通過賦值語句創(chuàng)建
元胞數(shù)組可以理解成更大級(jí)別的矩陣(能存放矩陣),用“{ }”來創(chuàng)建,以區(qū)別創(chuàng)建矩陣的“[ ]”
a = {'hello' [1 2 3;4 5 6];1 {'1' '2'}} 創(chuàng)建2×2的元胞數(shù)組,% 同行元素間用“, 或空格”隔開 % 行與行間用“;”隔開
% 第1行第1列的元胞,存放字符串'hello'; % 第1行第2列的元胞,存放一個(gè)2×3矩陣 % 第2行第1列的元胞,存放數(shù) 1 % 第2行第2列的元胞,存放1×2元胞數(shù)組
運(yùn)行結(jié)果:a =
'hello'
[2x3 double] [
1]
{1x2 cell }
2.對(duì)元胞數(shù)組各元胞一一賦值
例如(1)中的元胞數(shù)組a也可以這樣創(chuàng)建:
a{1,1} = 'hello';a{1,2} = [1 2 3;4 5 6];a{2,1} = 1;a{2,2} = {'1' '2'}};
3.用cell()函數(shù)創(chuàng)建
a = cell(2,3)
% 生成2×3的空元胞數(shù)組
此時(shí),a =[]
[]
[] []
[]
[] 再賦值或操作。
二、元胞數(shù)組元胞的訪問
訪問元胞數(shù)組的元素根據(jù)不同需要有兩種語法:(1)用“{ }”
a{i, j}——返回第i行第j列元胞的數(shù)據(jù)內(nèi)容。比如,a為前例中的元胞數(shù)組,a{1,2} = 1 4(2)用“()”
a(i,j)——返回第i行第j列的元胞(外觀)。比如,a(1,2)= [2x3 double]
三、元胞數(shù)組的操作(函數(shù))
iscell(a)——判斷a是否是元胞數(shù)組,返回邏輯值1或0; celldisp(a)——顯示元胞數(shù)組a中各元胞的內(nèi)容;
celldisp(a,’cell1’)——顯示元胞數(shù)組a中各元胞的內(nèi)容,用“cell1”代替元胞數(shù)組名“a”;
cellplot(a)——以圖形化的方式顯示元胞數(shù)組a的內(nèi)容;
a = {'hello' [1 2 3;4 5 6];1 {'1' '2'}};iscell(a)celldisp(a)celldisp(a,'cell')cellplot(a)
運(yùn)行結(jié)果:ans=
a{1,1} =hello a{2,1} = a{1,2} = 4 a{2,2}{1} =1 a{2,2}{2} =2
cell{1,1} =hello cell{2,1} = cell{1,2} = 4 cell{2,2}{1} =1 cell{2,2}{2} =2
cellstr(S)——S為字符串矩陣,把字符串矩陣轉(zhuǎn)換為元胞數(shù)組,每個(gè)字符串作為元胞數(shù)組的元胞位置不變,并去掉末尾的空格;
S = {'hello' 'hi';'yes' 'OK';'no' 'not';'goodbye' 'bye bye'};cellstr(S)
運(yùn)行結(jié)果:ans=
'hello'
'hi'
'yes'
'OK'
'no'
'not'
'goodbye'
'bye bye' 注意:字符串中間的空格保留。
num2cell(A,1)——A為數(shù)值矩陣,把數(shù)值矩陣轉(zhuǎn)換為元胞數(shù)組,把A的每一列轉(zhuǎn)換為一個(gè)元胞;num2cell(A,2),A的每一行轉(zhuǎn)換為一個(gè)元胞;
A = [1,2,3;4,5,6;7,8,9;10,11,12] C = num2cell(A,1)D = num2cell(A,2)
運(yùn)行結(jié)果:A = 4 7 10
C = [4x1 double]
[4x1 double]
[4x1 double] D=
[1x3 double] [1x3 double] [1x3 double] [1x3 double]
mat2cell(X, M,N)——把矩陣X轉(zhuǎn)換為元胞數(shù)組,M、N為向量,M中各元素之和等于X的行數(shù),N中各行之和等于X的列數(shù);
例,把4×5矩陣(20個(gè)數(shù))轉(zhuǎn)換為2×2(4塊)的元胞數(shù)組:
A = reshape(1:20,4,5);B = mat2cell(A, [2 2], [3 2])celldisp(C4)
運(yùn)行結(jié)果:A =1
2
3
4
B =
[2x3 double]
[2x2 double] [2x3 double]
[2x2 double]
B{1,1} =
B{2,1} =
B{1,2} =
14
B{2,2} =
16
另外,元胞數(shù)組可以類似矩陣操作實(shí)現(xiàn)變形(reshape()函數(shù))、拼接等(略)。
下次內(nèi)容——結(jié)構(gòu)數(shù)組(類似于C語言中的結(jié)構(gòu)體)。
第二篇:Matlab學(xué)習(xí)心得系列——005. 結(jié)構(gòu)數(shù)組
005.結(jié)構(gòu)數(shù)組
編程語言要描述日常生活中的某一類事物,就是要賦予這類事物一個(gè)公共名稱(類名),再把這類事物具有的各種屬性分別存放為若干變量(數(shù)據(jù)元素),這就是“結(jié)構(gòu)體”。結(jié)構(gòu)體里再加上若干操作其數(shù)據(jù)元素的函數(shù)(成員函數(shù)),就是“類”。然后,“類”就可以作為新的數(shù)據(jù)類型定義對(duì)象(類的實(shí)例化),再操作這些對(duì)象,實(shí)現(xiàn)編程需要。
以上就是面向?qū)ο蟮木幊趟枷耄ㄟm合C++或Java)。
例如,描述學(xué)生,就用一個(gè)學(xué)生類Student;學(xué)生屬性:學(xué)號(hào)、姓名、專業(yè);實(shí)現(xiàn)操作:學(xué)生轉(zhuǎn)專業(yè)。(粗略C++代碼)
classStudent { private:// 數(shù)據(jù)元素一般設(shè)為該類的私有數(shù)據(jù),防止屬性被隨意修改 int number;string name;
// string定義字符串 stringmajor;public: // 成員函數(shù)一般設(shè)為可公共訪問
Student(intnum, string n, string m);// 類構(gòu)造函數(shù)用于生成具體對(duì)象,必須與類名相同 voidChangeMajor(String newmajor);} Student::Student(intnum, string n, string m){ number = num;name = n;major = m;} void Student::ChangeMajor(String newmajor)// Student::表示函數(shù)是來自Student類 { major = newmajor;} // 下面是使用Student類:
Student s1;
// 用Student類定義一個(gè)“學(xué)生”對(duì)象s1 s1.ChangeMajor(“Math”);//把學(xué)生s1的專業(yè)修改為“Math”
可見,借助結(jié)構(gòu)體或類的編程,既能與現(xiàn)實(shí)世界中的事物建立自然的對(duì)應(yīng)(符合思維習(xí)慣),又能實(shí)現(xiàn)模型化的“批量生產(chǎn)”(用“類”可以整體性地、一遍一遍地建立對(duì)象、操作對(duì)象)。這也是結(jié)構(gòu)體或類(面向?qū)ο缶幊蹋┑膬?yōu)勢(shì)所在。__________________________ 回到Matlab,元胞數(shù)組只是呆板的堆放數(shù)據(jù)的倉庫,結(jié)構(gòu)數(shù)組則具有了與實(shí)際對(duì)象所對(duì)應(yīng)的結(jié)構(gòu)屬性,這等同于“C語言的結(jié)構(gòu)體”、“C++或Java的類的數(shù)據(jù)成員部分”。
結(jié)構(gòu)數(shù)組是由若干個(gè)結(jié)構(gòu)(struct)組成,每個(gè)結(jié)構(gòu)都包含多個(gè)結(jié)構(gòu)域(fields);數(shù)據(jù)必須存放在結(jié)構(gòu)域中,可以是任何類型、任意大小的數(shù)據(jù)。例如,多個(gè)圖形對(duì)象構(gòu)成一個(gè)結(jié)構(gòu)數(shù)組,每個(gè)圖形對(duì)象就是一個(gè)結(jié)構(gòu),圖形對(duì)象的一個(gè)屬性對(duì)應(yīng)一個(gè)結(jié)構(gòu)域。
即,結(jié)構(gòu)數(shù)組(矩陣)的元素是結(jié)構(gòu),每個(gè)結(jié)構(gòu)包含若干結(jié)構(gòu)域。
一、結(jié)構(gòu)數(shù)組的創(chuàng)建 1.用直接賦值語句創(chuàng)建
例1 創(chuàng)建學(xué)生的結(jié)構(gòu)數(shù)組,每個(gè)結(jié)構(gòu)包含學(xué)號(hào)、姓名兩個(gè)結(jié)構(gòu)域(屬性)
student(1).number = '001';% 直接對(duì)結(jié)構(gòu)數(shù)組第1個(gè)結(jié)構(gòu)s(1)的結(jié)構(gòu)域number賦值
student(1).name = '張三';student(1).number = '002';student(2).name = '李四';student
運(yùn)行結(jié)果:student = 1x2 struct array with fields: number name 注意:上面是一維結(jié)構(gòu)數(shù)組,也可以是二維或更多維的,例如,student(1,2).name = '……';
2.用struct函數(shù)創(chuàng)建
語法:s = struct(‘field1’, values1, ‘field2’, values2, …)student(1)= struct('number', '001','name', '張三');student(2)= struct('number', '002','name', '李四');student
運(yùn)行結(jié)果同上。
二、結(jié)構(gòu)數(shù)組的操作
1.訪問結(jié)構(gòu)數(shù)組中的結(jié)構(gòu)域
(1)通過結(jié)構(gòu)域訪問操作符“.”例如,student(2).name返回學(xué)生二的姓名:李四
(2)利用deal()函數(shù)
[name1, name2] = deal(student(:).name)
返回name1 =張三name2 =李四 “:”表示所有結(jié)構(gòu)域
(3)利用getfield()函數(shù)獲取指定結(jié)構(gòu)域的值,對(duì)于前面的結(jié)構(gòu)數(shù)組student,大小是1×2 getfield(student,{1,2},'name')% 返回結(jié)構(gòu)數(shù)組student第1行第2列的結(jié)構(gòu)的結(jié)構(gòu)域?yàn)閚ame的值,% 相當(dāng)于student(1,2).name
運(yùn)行結(jié)果:ans= 李四
2.其他操作
(1)設(shè)置或修改結(jié)構(gòu)域的值——setfield()
student = setfield(student,{1,2},'name', ‘王五’);——修改student(1,2).name的值為‘王五’
注意:必須把setfield()返回值賦給原結(jié)構(gòu)數(shù)組,修改才會(huì)生效。
(2)刪除結(jié)構(gòu)數(shù)組的指定結(jié)構(gòu)域——rmfield()
s.field1 = [1,2,3];s.field2 = 'string';s.field3 = {1 2 3;4 5 6};s s =rmfield(s,{'field2','field3'})s = rmfield(s,'field1')
運(yùn)行結(jié)果:s =
field1: [1 2 3]
field2: 'string' field3: {2x3 cell}
s =
field1: [1 2 3]
s =1x1 struct array with no fields.注意:必須把rmfield()返回值賦給原結(jié)構(gòu)數(shù)組,刪除才會(huì)生效。
(3)判斷函數(shù)
isfield(s, ‘fieldname’)——判斷s中是否含有名為fieldname的結(jié)構(gòu)域; isstruct(s)——判斷s是否是結(jié)構(gòu)數(shù)組
3.結(jié)構(gòu)數(shù)組與元胞數(shù)組的相互轉(zhuǎn)換
(1)結(jié)構(gòu)數(shù)組轉(zhuǎn)元胞數(shù)組——struct2cell()
s.field1 = [1,2,3];s.field2 = 'string';s.field3 = {1 2 3;4 5 6};s c = struct2cell(s)運(yùn)行結(jié)果:s =
field1: [1 2 3] field2: 'string' field3: {2x3 cell} c =
[1x3 double] 'string'
{2x3 cell }(2)元胞數(shù)組轉(zhuǎn)結(jié)構(gòu)數(shù)組
s = cell2struct(c, fields, dim)
c = {‘001’, ‘張三’, 175, 65;‘002’, ‘李四’, 178, 70}
fields = {'Num','Name','Height','Weight'};% 臨時(shí)變量,存放全部的結(jié)構(gòu)域名
s = cell2struct(c,fields,2)% dim=2表示將c按行轉(zhuǎn)為結(jié)構(gòu)數(shù)組(即每行是一個(gè)結(jié)構(gòu))% dim=1表示將c按列轉(zhuǎn)為機(jī)構(gòu)數(shù)組(即每列是一個(gè)結(jié)構(gòu))
s(1)
運(yùn)行結(jié)果:c =
'001'
'張三'
[175]
[65] '002'
'李四'
[178]
[70]
s =2x1 struct array with fields: Num Name Height Weight ans=Num: '001' Name: '張三' Height: 175 Weight: 65
下次內(nèi)容:字符串。
第三篇:matlab學(xué)習(xí)心得
學(xué)習(xí)MATLAB 感想 學(xué)習(xí)了 MATLAB 這門課程,我了解該軟件的基本功能,也知道 了該軟件在我們生活中的重要地位。隨著社會(huì)的不斷發(fā)展,科技 的不斷進(jìn)步,計(jì)算機(jī)的普及,它也被應(yīng)用在越來越多的方面。MATLAB 的基本數(shù)據(jù)單位是矩陣,它的指令表達(dá)式與數(shù)學(xué)、工 程中常用的形式十分相似,故用 MATLAB 來解算問題要比用 C,F(xiàn)ORTRAN 等語言完成相同的事情簡捷得多,MATLAB 的最突出的 特點(diǎn)就是簡潔。MATLAB相對(duì)于其他的一些編程軟件有許多的優(yōu)點(diǎn):
一、語言簡潔緊湊,使用方便靈活,庫函數(shù)極其豐富。
二、運(yùn)算符豐富。
三、MATLAB既具有結(jié)構(gòu)化的控制語句(如for循環(huán)、while循環(huán)),又有面向?qū)ο缶幊痰奶匦浴?/p>
四、語法限制不嚴(yán)格,程序設(shè)計(jì)自由度大。
五、程序的可移植性很好,基本上不做修改就可以在各種型號(hào)的計(jì) 算機(jī)和操作系統(tǒng)上運(yùn)行。
六、MATLAB的圖形功能強(qiáng)大。用madlab創(chuàng)建矩陣時(shí),方法有兩種:第一、可以直接依次輸入矩 陣各行各列的元素,但矩陣元素必須用[ ]括住,矩陣元素必須用逗號(hào) 或空格分隔,在[ ]內(nèi)矩陣的行與行之間必須用分號(hào)分隔。第二、用 MATLAB函數(shù)創(chuàng)建矩陣。MATLAB可以進(jìn)行矩陣的加減、乘除的元 素,求可逆矩陣、轉(zhuǎn)置矩陣,求矩陣的特征值,求線性方程組等等。MATLAB的功能是非常強(qiáng)大的,MATLAB不僅有強(qiáng)大的運(yùn)算功 能,它還有強(qiáng)大的繪圖功能,我對(duì)它的了解也僅僅就是一點(diǎn)點(diǎn),或許 說還沒有入門。比如說它含有豐富的內(nèi)建函數(shù),例如數(shù)學(xué)函數(shù)中的三 角函數(shù)、復(fù)函數(shù)、多項(xiàng)式函數(shù)、數(shù)據(jù)分析函數(shù)的求平均值、最大最小 值、排序等,以及邏輯/選擇函數(shù)如if-else等,還有用來模擬隨機(jī)發(fā) 生事件的隨機(jī)函數(shù)。這些我都不了解。雖學(xué)習(xí)MATLAB的時(shí)間雖然很短,但卻讓我了解到了它的強(qiáng)大和 它的功能。我想就算時(shí)間足夠,老師也不能把所有的都講解給我們,因?yàn)橐粋€(gè)軟件的功能需要我們自己不斷的去摸索,老師也不可能知道 所有。老師只是個(gè)指路的明燈,最終的學(xué)習(xí)還是要靠自己。而且在摸 索過程中,我們能夠發(fā)現(xiàn)和體會(huì)學(xué)習(xí)的快樂!
第四篇:Matlab學(xué)習(xí)心得
? matlab博大精深,說到底我也只不過是個(gè)初學(xué)者,只是學(xué)的時(shí)間比新手長了一點(diǎn),現(xiàn)在寫幾句給新手,希望能給你們有點(diǎn)幫助 1 學(xué)Matlab并不難,難的是學(xué)會(huì)怎么用。
2不要試圖掌握matlab的每一個(gè)功能,熟悉和你專業(yè)最相關(guān)的部分就可以了。不要問:明天要交作業(yè)了,哪位大俠幫忙寫個(gè)程序吧,或初學(xué)matlab,不懂呀,大哥大姐幫忙寫個(gè)程序之類的話
不要等到要用到才去學(xué),如果你有興趣,你有時(shí)間,你可以多學(xué)些東西,說不定什么時(shí)候就用了,機(jī)會(huì)只偏愛那些有準(zhǔn)備的頭腦,到時(shí)候就不會(huì)說什么,要做東西想讓人指點(diǎn),基礎(chǔ)的東西來不及仔細(xì)看了,一寫程序嗎,低級(jí)錯(cuò)誤滿天飛 不要說:不要讓我看matlab英文的幫助我看不懂--誰都是從不懂到懂的 不要擔(dān)心:我編程能力差,我一定用不好matlab。6 不要只問不學(xué) 7 學(xué)maltab要有耐心 看到某本書中或論壇的帖子中解決問題的方法要試著解決類似的問題,要舉一反三,要學(xué)會(huì)變通 有了問題先自己想,察看幫助,1個(gè)小時(shí)后沒有結(jié)果再問別人,不要一有問題就發(fā)問,然后什么都不管了,把希望寄托在別人身上 10 學(xué)會(huì)用搜索引擎,在網(wǎng)上可以找到很多資料,有的問題一搜索就能找到的,就不要來問別人了 11要多動(dòng)腦,多動(dòng)手寫程序、調(diào)試,看程序時(shí)候多想幾個(gè)為什么,理解別人程序中精華的東西,多自己調(diào)調(diào)程序,可以改改程序,把知識(shí)轉(zhuǎn)成自己的,弄懂一兩個(gè)經(jīng)典例子比粗粗的看一大書要好,值得一提是不是一下子就能看懂相對(duì)比較長,比較復(fù)雜的程序的,要做的是自己慢慢去分析,利用已經(jīng)有的資料和幫助,等慢慢搞懂它,要多看幾遍,相信多看一遍你就會(huì)有一些新的認(rèn)識(shí),一直到你已經(jīng)掌握里例子的精華。多讀matlab高手寫的程序,帖子,找到一個(gè)高手,在幾個(gè)大的論壇可以搜索出一大堆的帖子,然后慢慢去看吧,從中可以學(xué)到很多東西,也許你會(huì)發(fā)現(xiàn)很多你都看不懂,這很正常,別人寫程序考慮的是能實(shí)現(xiàn)這樣的功能,運(yùn)行效率等問題,而不是考慮是不是很容易能讓別人理解,你就看你現(xiàn)在能看懂,再看些通過你斷點(diǎn)調(diào)試,查help能看明白的,看不懂的就先放下,遇到好的和看不懂,你又很挺感興趣的話題,你先收藏起來,過段時(shí)間你再回頭看看,你會(huì)發(fā)現(xiàn),每看一遍,你就會(huì)多懂一些東西,當(dāng)你第三遍甚至第四遍看同一個(gè)程序的時(shí)候,也許你就會(huì)有豁然開朗的感覺。一個(gè)比較長的程序,首先不要怕長,把它分解成一句一句,一句一句看懂它。要明白一口吃不成胖子,好東西要慢慢體會(huì),才能領(lǐng)會(huì)。電腦上復(fù)制粘貼很方便,對(duì)于別人解決的你專業(yè)上的問題,最好自己寫一遍,這樣印象深刻,對(duì)于不懂的函數(shù)用法的函數(shù),help中查查,能看懂多少算多少,對(duì)于程序斷點(diǎn)調(diào)試一遍,弄清楚每個(gè)語句的功能,14 盡量擺脫c編程的習(xí)慣,總愛用循環(huán),能不用的循環(huán)的盡量不用,掌握矢量化的精髓 善于總結(jié),學(xué)習(xí)過的知識(shí),看過好的帖子可以收藏起來,過段時(shí)間再復(fù)習(xí)一下,一段時(shí)間的積累,你會(huì)發(fā)現(xiàn)你的水平在慢慢提高 16 多用help,see also lookfor get,set 等常用命令 要大膽的去試,試過才知道可不可以,如有人問可不可以把多個(gè)子程序放在一個(gè)m文件中,呵呵,試試不就知道了 多參與討論,不要只關(guān)心自己的問題,也經(jīng)常關(guān)注別人的帖子,從中也可以學(xué)到不少東西的 提醒一句,不要做只會(huì)下資料而不看的收藏家,這樣對(duì)你沒什么意義,書不在于多,真的看一兩本書也就夠了,以后要用的時(shí)候,再去查書,一味的東看看西看看,見了別人的資料,不關(guān)好不好,就留信箱的人,我感覺也不該這樣,有了那么多資料,就別想著還有沒有比這更好的了,開始學(xué)吧先寫這么多吧,希望對(duì)新手能有點(diǎn)用 感覺語言是相通的,不一定只針對(duì)matlab這門語言
如何寫程序,如果你還是初學(xué)者,那么盡量不要復(fù)制粘貼,那樣你是永遠(yuǎn)也無法學(xué)會(huì)寫程序的。另外也不要對(duì)著別人的程序,一個(gè)字一個(gè)字敲進(jìn)去,那樣的話你只能成為一名優(yōu)秀的打字員。一個(gè)比較好的方法是先讀懂他,理清他的思路,然后自己動(dòng)手寫,寫不出來的時(shí)間再看看別人的程序,然后對(duì)照的看,你的和他的程序差異在哪里,寫的過程就是提高的過程。
程序運(yùn)行有錯(cuò)誤怎么辦,好多錯(cuò)誤。首先,別害怕錯(cuò)誤,這是每一個(gè)人都會(huì)碰到的問題,大牛,小蝦都一樣,你對(duì)你自己說 這不機(jī)會(huì)又來了,調(diào)程序的過程就是提高的過程。不要一遇到錯(cuò)誤就來論壇發(fā)問了,如何調(diào),關(guān)鍵是看錯(cuò)誤提示,看錯(cuò)誤的類型及出現(xiàn)在哪條語句上。好好練自己的調(diào)試能力,這不僅可以幫你找到一些錯(cuò)誤,有是碰到一些讀不懂的程序,借助斷點(diǎn)調(diào)試可以幫你讀懂程序
還不行怎么辦,用搜索引擎找答案(有時(shí)候把錯(cuò)誤提示輸進(jìn)去就可以找到答案了)
還不行,這才發(fā)貼和別人交流。。
寫程序原則 盡量寫的簡單 通俗容易懂,讓那些不如你聰明的人都能看懂,命名的時(shí)候做到見名知意,寫的時(shí)間多加點(diǎn)注釋,不然,不要說別人讀不懂你的程序,等過幾天,你自己也讀不懂了,可以看看matlab里的函數(shù),注釋也寫的很詳細(xì),當(dāng)你覺得有些方法比較常用的時(shí)候,你可以封裝成函數(shù),加上一些說明,以后要用的時(shí)候,直接調(diào)用就可以了,注重代碼的重用性。
勿在浮砂筑高臺(tái),基礎(chǔ)很重要,為什么學(xué)matlab,如果你只是把它當(dāng)成 c c++的附屬品,用這些語言的思維來寫一些奇怪的類matlab程序,我想你還是直接用c 或 c ++更合適,不要一開始就想著用matlab 做出什么東西,好好看一本matlab的基礎(chǔ)書,這些基礎(chǔ)對(duì)你以后的進(jìn)階會(huì)很有幫助。再說混合編程,什么都不懂就想著去混合編程是不實(shí)際的,maltab版本 vs 的版本不同,都會(huì)對(duì)混合編程影響的。所以結(jié)果是對(duì)著別人的例子來做也不一定會(huì)做出來,一是別人講的有些細(xì)節(jié)問題沒講清楚,二是版本問題。就算做出來,如果不明白為什么要這樣做,又有多大意義呢。然后自己做一個(gè),又不會(huì)了。說這些的目的無非是希望想做混合編程的朋友多了解一些基礎(chǔ)的東西,否則在混合編程這一塊上會(huì)浪費(fèi)很多時(shí)間,結(jié)果還是沒有解決問題。
7.0系列 深入淺出matalb混合編程這本書是值得一看的。多看幫助之類的話這里就不多說了。
Recent developments in linear quadtree-based geographic information systems
第五篇:matlab學(xué)習(xí)心得
編程心得
1.helpwin只是尋找函數(shù)類,一般不如用doc(相當(dāng)于幫助文檔中的搜索),但在用doc搜索不到幫助文件時(shí)可用helpwin,如找有關(guān)的幫助等;打開格式非標(biāo)準(zhǔn)的mat或xls等數(shù)據(jù)文件如dat文件或無后綴名的文件時(shí),不要用打開方式打開,而應(yīng)先打開應(yīng)用程序如MATLAB或excel,然后在應(yīng)用程序中打開數(shù)據(jù)文件,這樣能得到正確的行數(shù)和列數(shù);lookfor可對(duì)M文件的第一行進(jìn)行關(guān)鍵字搜索,比help條件寬松;MATLAB大小寫有區(qū)分。用which搜索路徑;要打開matlab自帶的m文件直接用open即可,不需要找到路徑,會(huì)在當(dāng)前目錄和set path的路徑中搜索。矩陣的運(yùn)算注意:標(biāo)量與矩陣進(jìn)行四則運(yùn)算時(shí)該標(biāo)量與矩陣的每個(gè)元素進(jìn)行運(yùn)算;兩矩陣相乘左矩陣列數(shù)須等于右矩陣行數(shù);矩陣除法有左除(反斜杠)和右除/(斜杠),AB=inv(A)*B,A/B=A*inv(B);方陣的乘方運(yùn)算有四種:A^n,A^p,s^A,s.^A,其中A為方陣,n為整數(shù),p為非整數(shù),s為標(biāo)量;A’表示矩陣A的轉(zhuǎn)置,一般選中了Hermitian(共軛)復(fù)選框則元素帶共軛;funm(A,’fun’)表示矩陣的函數(shù)運(yùn)算,要求A是方陣,fun為矩陣運(yùn)算函數(shù)名;給矩陣賦值時(shí)維數(shù)必須匹配,用方括號(hào),一個(gè)分號(hào)為一行。
3.?dāng)?shù)組的運(yùn)算注意:數(shù)組乘法運(yùn)算符為.*,表示兩數(shù)組中對(duì)應(yīng)元素相乘;數(shù)組的除法運(yùn)算符為.和./,表示對(duì)應(yīng)元素相除;數(shù)組與數(shù)組運(yùn)算時(shí),參與運(yùn)算的數(shù)組必須同維,結(jié)果為數(shù)組中每個(gè)元素進(jìn)行運(yùn)算所得;直接用結(jié)構(gòu)名賦值即省略了(1);varargout返回輸出變量list即一系列變量名稱;feval(@fun,var1,?)用var1,?試算[evaluate]fun的值;讀二進(jìn)制文件常用fopen()和fread()組合,matlab讀fortran寫出的二進(jìn)制文件時(shí)往往要在fopen()中加'b';讀文本文件常用textread()和fopen();fscanf()組合,要注意格式,最好讀完后對(duì)照打開看看。
4.標(biāo)準(zhǔn)差std(x,flag,dim)默認(rèn)flag=0,dim=1計(jì)算公式為 的平方根,flag=1時(shí)分母為n;可通過h=figure(i),后用get(h)獲得圖形對(duì)象所有屬性的當(dāng)前值,其格式為:屬性名=屬性值;結(jié)構(gòu)數(shù)組可在域名后加(a,b)再加.變量名,調(diào)用時(shí)輸變量名可使用tab完成;利用struct函數(shù)一次輸入多個(gè)結(jié)構(gòu)元素時(shí)注意用單元數(shù)組,用{}而非[]。
5. 左除和右除的兩邊不一定是方陣,當(dāng)A為m*n矩陣,B為列向量時(shí),AB表示A*X=B在最小平方意義上的解,需對(duì)A進(jìn)行QR分解,m
8. 低級(jí)文件I/O函數(shù)很重要,因?yàn)樗勺x寫二進(jìn)制文件,便于與FORTRAN結(jié)合;讀寫之前先用fopen(filename,mode),注意都要加單引號(hào),返回值如ans=0表示操作成功,-1表示不成功;一定要注意r和w因?yàn)閣會(huì)刪除原文件所有內(nèi)容;讀用fread(fid,count,precision,skip)其中precision如'uint8=>char'讀取文本文件,注意在fclose(fid)之前是連續(xù)讀的,不指定precision默認(rèn)按字節(jié)讀取可能會(huì)出現(xiàn)很多元素為0;fwrite(fid,A,precision,skip)用二進(jìn)制格式寫入文件,skip參數(shù)對(duì)于將數(shù)據(jù)插入到已知長度的記錄中非常有用;重設(shè)文件指針位置用fseek(fid,offset,origin)表示在fid指定的文件上按照origin給出的參照點(diǎn),相對(duì)移動(dòng)offset個(gè)字節(jié),注意如果指針不在開頭要重置到開頭origin應(yīng)選'cof'當(dāng)前位置而不選'bof'文件開始,重置完后可用ftell(fid)知道指針當(dāng)前位置相對(duì)于bof的字節(jié)數(shù),還可用ferror(fid)查詢錯(cuò)誤信息;還可用frewind(fid)函數(shù)將文件位置指針返回到文件起始位置;從文本文件讀字符串行用fgets(fid,nchar)表示讀一行文本并帶有行結(jié)束符,每次讀nchar個(gè)字符直到遇上結(jié)束符。9.如果運(yùn)行的M文件有錯(cuò)誤,而且在命令窗口又要運(yùn)行M文件中定義錯(cuò)誤的內(nèi)置函數(shù)時(shí)可能會(huì)出現(xiàn)錯(cuò)誤,這時(shí)應(yīng)改工作目錄;有些內(nèi)置函數(shù)可在命令窗口運(yùn)行但在M文件中運(yùn)行可能會(huì)出現(xiàn)錯(cuò)誤,如sphere(n);腳本M文件與命令窗口公用變量工作區(qū),而函數(shù)M文件有單獨(dú)的變量工作區(qū),切實(shí)注意了;關(guān)系操作表達(dá)式返回的是邏輯型值即0和1。
10.?dāng)?shù)組維數(shù)擴(kuò)展時(shí)下標(biāo)不要用1,因這是默認(rèn)下標(biāo)用1后結(jié)果是重新賦值;不同數(shù)組類型轉(zhuǎn)換如cell2struct等之前一定要先看數(shù)組尺寸size(array);變量名切記不要用函數(shù)名,否則調(diào)用函數(shù)時(shí)會(huì)出錯(cuò)還不知錯(cuò)在哪,因MATLAB優(yōu)先使用變量名而非函數(shù)名,比如定義了變量max再調(diào)用max()函數(shù)時(shí)就會(huì)報(bào)錯(cuò)Subscript indices must either be real positive integers or logicals;中括號(hào)加引號(hào)用于多個(gè)文件名可以,用于多個(gè)變量名不行;簡單統(tǒng)計(jì)量比如最大值,最小值,平均值加減后再統(tǒng)計(jì)和統(tǒng)計(jì)后再加減結(jié)果一樣;函數(shù)不管用或者出錯(cuò)應(yīng)檢查是否不小心加了等號(hào)。
11.設(shè)置坐標(biāo)軸刻度和屬性時(shí)用set(gca,'xtick',數(shù)值數(shù)組);set(gca,'xticklabel',字符串?dāng)?shù)組);切記是label不要寫成lable;用box off可以去掉右邊和上邊的刻度和邊框;把右邊和上邊分別作為y和x軸可以加畫圖形,但最好不用plot而用line;有關(guān)坐標(biāo)軸設(shè)置的例子可見我的程序plotNino.m;要實(shí)現(xiàn)坐標(biāo)軸隔點(diǎn)標(biāo)注數(shù)值且所有點(diǎn)間隔線均保留需設(shè)置兩次坐標(biāo)軸,第一次顯示所有間隔線第二次用ax2=axes()后隔點(diǎn)標(biāo)注;放大工具只對(duì)ax2有效;標(biāo)注時(shí)字符矢量用{}且非數(shù)字字符必須加引號(hào);注意annotation()中[x y w h]的x,y是對(duì)整個(gè)figure而言;標(biāo)記單個(gè)數(shù)據(jù)點(diǎn)用scatter()即可。
12.MatLab小波分析工具箱中一些學(xué)習(xí)心得:進(jìn)行多分辨率分析時(shí),wavedec()得到的小波系數(shù)是由最后一層的低頻系數(shù)和各層的高頻系數(shù)首尾相連而成,不是相加;用wrcoef()可重構(gòu)各單支系數(shù)的對(duì)應(yīng)信號(hào)且saN+sdN+sdN-1+?+sd1近似等于原始信號(hào)s;用waverec()一次重構(gòu)的結(jié)果和單支重構(gòu)的和稍有差別但差別很小如e-15;用wavedec()時(shí)注意有些小波函數(shù)不能用如Morlet小波基等,具體可看wfilters();小波分解再重構(gòu)后與原始信號(hào)相差最小的小波函數(shù)為db1即Haar小波基;
13.只有函數(shù)式M文件才能定義函數(shù),腳本文件和函數(shù)不能寫入同一個(gè)m文件中,即腳本文件中不允許出現(xiàn)function()語句但可以調(diào)用同目錄下函數(shù)文件中的函數(shù);函數(shù)文件要想保留一些中間變量的值就要在函數(shù)外部調(diào)用因?yàn)楹瘮?shù)調(diào)用結(jié)束時(shí)會(huì)銷毀臨時(shí)變量空間,需另寫腳本文件,要不然就將需要導(dǎo)出的變量作為返回的參數(shù)或者用global申明全局變量;要使函數(shù)文件中的函數(shù)易被其他腳本文件調(diào)用,文件名最好為第一函數(shù)名;一張圖中畫多張子圖時(shí)注意subplot(‘Position’,[ ])和axes(‘OuterPosition’,[ ])在[]中值一樣時(shí)子圖的位置大小不一樣,axes的[]所給區(qū)域按比例縮小包含坐標(biāo)軸標(biāo)題等故值易確定但調(diào)用時(shí)要加(..,’Parent’,*),此外subplot()可有系統(tǒng)給定區(qū)域;
MATLAB中內(nèi)置的函數(shù)
linspace(a,b,n)生成a~b之間線性分布的行向量,n默認(rèn)值為100。
logspace(a,b,n)生成10^a~10^b之間按對(duì)數(shù)等分的n個(gè)元素的行向量,n默認(rèn)50。zeros(m,n)生成m*n的全0矩陣;
ones(m,n)生成m*n的全1矩陣 rand(m,n)生成m*n均勻分布的單位間隔上隨機(jī)矩陣,取值范圍0.0~1.0 randn(m,n)生成m*n正態(tài)分布的隨機(jī)矩陣,取值范圍是整個(gè)實(shí)數(shù)區(qū)間
eye(m,n)生成m*n的單位矩陣; magic(n)生成n階魔方矩陣,n>=3 triu(X)生成X矩陣的上三角矩陣; tril(X)生成X矩陣的下三角矩陣
flipud(X)使矩陣沿水平軸上下翻轉(zhuǎn); fliplr(X)使矩陣沿垂直軸左右翻轉(zhuǎn);
Flipdim(X,dim)使矩陣沿特定軸翻轉(zhuǎn); rot90(X)使矩陣逆時(shí)針旋轉(zhuǎn)90度 cat(n,A1,A2,?,Am)n=1時(shí)子矩陣上下排列,n=2時(shí)子矩陣左右排列,n=3時(shí)子矩陣數(shù)m為第三維; repmat(A,行,列,頁,??)模塊矩陣A按后邊格式重復(fù)排列
ndims(P)返回?cái)?shù)組P的維數(shù); size(P)返回向量其元素為數(shù)組各維的大小; length(P)返回?cái)?shù)組P行數(shù)或列數(shù)的最大值
[L,U,P]=lu(X)矩陣X的三角分解,U為上三角,L為下三角,P為單位陣的行變換矩陣
[U,S,V]=svd(X)矩陣的奇異值分解,S為對(duì)角陣,U,V為酉矩陣,X=U*S*V’ [V,D]=eig(A,B,flag)由flag制定算法計(jì)算矩陣A和B的特征值D和特征向量V,flag的可能值為chol或qz;
[R,p]=chol(X)表示使用Cholesky分解算法,若X對(duì)稱正定則存在非奇異上三角陣R使R’*R=X,若X非正定則p為正整數(shù)R為有序上三角陣;[Q,R]=qr(A)
求正交矩陣Q和上三角陣R使A=QR;
T=schur(A,flag)返回正交矩陣U和schur矩陣T使A=U*T*U’;
rsf2csf(VR,DR)將實(shí)舒爾形式轉(zhuǎn)化成復(fù)舒爾形式; gsvd(A,B)廣義奇異值分解; qz(A,B)特征值問題的QZ分解; hess(A)海森伯格形式分解;
sparse(A)返回A的稀疏矩陣形式; full(S)將稀疏矩陣轉(zhuǎn)化為全元素矩陣; spy(S,’lineSpec’,markersize)用圖形顯示矩陣,點(diǎn)表示矩陣中非零元素位置。colmmd(S)返回稀疏矩陣列的最小度排序向量p,按p排列后的矩陣為S(:,p)。
setfield(ps,{i,j,k},域名,賦值)修改結(jié)構(gòu)數(shù)組ps中域的存儲(chǔ)內(nèi)容,返回維數(shù)為i*j*k。lower(string)把字符串中的大寫變?yōu)樾憽?/p>
strncmp(‘str1’,’str2’,n)比較兩字符串的前n個(gè)字符,str2可換為單元數(shù)組C,返回邏輯數(shù)組
lookfor name 尋找第一行注解H1中含有name的M文件。
findstr(str1,str2)先比較兩個(gè)字符串,然后在長的中找與短的匹配的子字符串,每找到一次返回匹配起始點(diǎn)的位置為數(shù)組元素。
fscanf(fid,format,size)從fid指定的文件讀size個(gè)數(shù)據(jù)并根據(jù)format指定的格式轉(zhuǎn)換,其中format如%c,%f,%d等,size為[m,n]時(shí)表示m*n矩陣按列存放,缺省讀全部數(shù)據(jù); fprintf(fid,format,A)按format指定格式轉(zhuǎn)換矩陣A中數(shù)據(jù)并將它們寫到fid指定文件,缺省fid時(shí),數(shù)據(jù)輸出在屏幕上。
Repmat(A,m,n)A為子矩陣,復(fù)制m*n次; fix(A)返回?cái)?shù)組中每個(gè)元素取整后的值; reshape(A,m,n)把數(shù)組A進(jìn)行重新排列,按列方式操作;
Prod(A)若A為向量則返回元素乘積,若A為矩陣則返回每列元素的乘積;
Permute(A,[a b c d])A為4維陣列,返回陣列的第1,2,3,4維為A的第a,b,c,d維 strcat(s1, s2, s3,...)把字符串或者單元數(shù)組s1,s2,s3進(jìn)行水平連接
w=conv(u,v)返回向量u和v的卷積,若m = length(u),n = length(v)則,j = max(1,k+1-n): min(k,m),k=1:m+n-1 [V,D] = eig(A)返回A的特征向量矩陣V和特征值矩陣D [S.field] = deal(X)域名為field的所有域元素賦值為X
[Y1, Y2, Y3,...] = deal(X{:})復(fù)制單元數(shù)組的內(nèi)容給變量Y1,Y2,Y3,? Num2cell(a,[i j])a為數(shù)值陣列,返回單元陣列每個(gè)單元為a保持第i,j維尺寸不變的數(shù)組
《MATLAB基礎(chǔ)與編程入門》
Page 2: MATLAB核心模塊有兩大分支分別以MATLAB為基礎(chǔ)和以simulink為基礎(chǔ)。MATLAB 2006b即MATLAB 7.3。MATLAB compiler能將M文件編譯生成為函數(shù)庫或可執(zhí)行文件,使其能與其他語言如C/C++混合應(yīng)用,MATLAB builder可將函數(shù)文件打包成com組件或.net組件、excel插件、java對(duì)象,將其應(yīng)用程序算法集成到開發(fā)工具或應(yīng)用軟件中。MATLAB的工具箱可提供函數(shù)給用戶直接使用,且其算法是開放和可擴(kuò)展的。MATLAB提供了與各種設(shè)備進(jìn)行數(shù)據(jù)I/O的交互工具和函數(shù)等。
Page 4: 工具箱包括:數(shù)學(xué)與數(shù)據(jù)分析,如spline 仿樣,mapping 繪圖、映射,genetic algorithm and direct research 遺傳算法和正變形研究等;數(shù)據(jù)采集與測(cè)量測(cè)試,如database 數(shù)據(jù)庫,excel link鏈接Excel等;信號(hào)處理與圖象處理,如system identification系統(tǒng)辨識(shí),wavelet 小波分析,filter design 濾波設(shè)計(jì)等;控制系統(tǒng)設(shè)計(jì)與分析,如 fuzzy logic 模糊邏輯,robust control 強(qiáng)控制等;財(cái)經(jīng)與金融,如 financial time series 金融時(shí)間序列,GARCH 廣義條件異方差等;應(yīng)用程序集成與發(fā)布,如 MATLAB report generator 報(bào)告生成器,MATLAB web server 網(wǎng)絡(luò)服務(wù)器,MATLAB builder for.NET 編碼器等。Page 5: simulink是框圖設(shè)計(jì)環(huán)境,可對(duì)各種動(dòng)態(tài)系統(tǒng)建模、分析和仿真,Stateflow可用來進(jìn)行邏輯驅(qū)動(dòng)過程的仿真。Simulink 可將用C、C++和fortran語言編寫的算法集成到框圖中,其實(shí)時(shí)代碼生成工具可進(jìn)行代碼驗(yàn)證。
Page 9: Real-Time Workship(RTW)可生成標(biāo)準(zhǔn)的C/C++代碼并具備生成其他語言代碼能力
《MATLAB編程基礎(chǔ)與典型應(yīng)用》
Page 8: MATLAB默認(rèn)每行命令產(chǎn)生的變量結(jié)果都顯示,加上英文狀態(tài)下;才不顯示??捎眠B續(xù)3個(gè)或以上的黑點(diǎn)?表示續(xù)行,但notebook中不能用。%表示其后一行的內(nèi)容為注釋。Page 10: 常用操作指令包括:clc, clear, clf, who, whos, delete
Page 43: MATLAB中的關(guān)系運(yùn)算符有<,<=,>,>=,==,~=;邏輯運(yùn)算符有&,|,~,xor,&&(先決與),||(先決或),先決表示左邊的運(yùn)算符合要求就不需執(zhí)行右邊運(yùn)算。Page 54: 稀疏矩陣大部分元素為0,故只需儲(chǔ)存非零元素的下標(biāo)和元素值。Page 72: 數(shù)值數(shù)組和字符串?dāng)?shù)組中存儲(chǔ)單元的數(shù)據(jù)類型相同,使用()操作;單元數(shù)組中每個(gè)單元存放的數(shù)據(jù)可能都不一樣,使用{}操作,獲取單元數(shù)組內(nèi)容時(shí)圓括號(hào)只顯示單元,花括號(hào)才顯示內(nèi)容。
Page 77: 結(jié)構(gòu)數(shù)組組織數(shù)據(jù)的能力比單元數(shù)組要強(qiáng)些,可通過struct(域名1,賦值,域名2,賦值??)函數(shù)創(chuàng)建;獲取結(jié)構(gòu)數(shù)組域中的具體內(nèi)容使用符號(hào).,也可用專用函數(shù)getfield()獲取;修改結(jié)構(gòu)數(shù)組中域存儲(chǔ)內(nèi)容的函數(shù)是setfield()。
Page 81: 多項(xiàng)式以行向量的形式存放且以降冪形式出現(xiàn),若缺少某冪次項(xiàng)則該項(xiàng)系數(shù)為0 Page 134: 句柄是圖形對(duì)象的標(biāo)志代碼,標(biāo)識(shí)代碼含有圖形對(duì)象的各種必要的屬性信息;圖形對(duì)象的所有屬性都是由屬性名和屬性值組成,對(duì)圖形對(duì)象屬性操作可實(shí)現(xiàn)不同表現(xiàn)效果,可通過句柄控制;用get(get(gca,'children'))命令可看到軸的子代的各種屬性值;可對(duì)圖形對(duì)象設(shè)置缺省對(duì)象屬性來實(shí)現(xiàn)繼承操作,還可用set(h,’.’,’.’)設(shè)置各種屬性?!毒∕ATLAB7編程與數(shù)據(jù)庫應(yīng)用》
Page 5: 為調(diào)試程序而進(jìn)入debug方式時(shí),提示符變?yōu)镵>>;運(yùn)算符兩邊的空格隨意添加后無區(qū)別;在命令歷史中查找,可將光標(biāo)定位于某行后敲要查找的語句的首字母;可將用得多的幾條語句選中后在右鍵菜單選”create shortcut”創(chuàng)立快捷鍵;命令窗口輸入pathtool或選File->Set path可設(shè)置搜索路徑。Page 19: 函數(shù)的輸入?yún)?shù)用圓括號(hào)括起來用逗號(hào)分隔,輸出參數(shù)在等式左邊用方括號(hào);語句的續(xù)行可在結(jié)尾用省略號(hào)(?);一行中可寫多個(gè)語句,語句用逗號(hào)或分號(hào)隔開,若想寫完多行命令再運(yùn)行可按shift + enter組合鍵;還可使用“Tab完成”,在命令和editor窗口寫入文件名、變量、結(jié)構(gòu)和函數(shù)名時(shí)只寫入前面的幾個(gè)字符后按Tab鍵。Page 24: 變量名是否正確可用isvarname查看0表有誤;變量類型包括三種,常用的是局部變量,全局變量要用global聲明且每個(gè)使用函數(shù)都要聲明,永久變量(一直在內(nèi)存中)要用persistent聲明。
Page 171: 程序開發(fā)的建議:
1. 化復(fù)雜為簡單:將每個(gè)任務(wù)做成一個(gè)獨(dú)立的函數(shù),函數(shù)盡量短;用數(shù)學(xué)語言寫出步驟和流程,再轉(zhuǎn)換成程序語言;選擇正確的數(shù)據(jù)結(jié)構(gòu)(如哪種數(shù)組)。
2. 遵循的原則:使用描述性的變量名和函數(shù)名,盡量不用縮寫;函數(shù)前面寫幫助的注解,說明函數(shù)功能;一行不要超出80列以便打??;函數(shù)只被另一個(gè)函數(shù)調(diào)用,把被調(diào)函數(shù)作為子函數(shù)與主函數(shù)放在同一個(gè)M文件上。
3. 函數(shù)命名的唯一性:用which –all 函數(shù)名 檢驗(yàn)。
4. 分步寫程序,分步調(diào)試:對(duì)較大程序,一次寫成一部分,然后測(cè)試;能正常工作且輸出結(jié)果合理,再寫下一部分;修改也一樣,每次調(diào)試一部分。
5. 程序最后測(cè)試:用debugger,可記錄下被執(zhí)行的每一行代碼;用不同的輸入組合測(cè)試,讓每一行至少執(zhí)行一次。Page 173: 在命令窗口的命令提示符下輸入M文件名可運(yùn)行該M文件;MATLAB與其它語言的區(qū)別之一是過程控制語句可能用到數(shù)組或矩陣;對(duì)if條件判斷,若邏輯表達(dá)式非標(biāo)量,那么它的所有元素值都非0,if條件才能滿足,也可以是空數(shù)組,表示條件為假。Page 175: 分支語句switch后的表達(dá)式可以是函數(shù)或數(shù)值或字符串;循環(huán)有兩種:次數(shù)確定的和依條件結(jié)束的;for循環(huán)中可用數(shù)組控制循環(huán)次數(shù),MATLAB把列數(shù)作為循環(huán)次數(shù);for語句可寫在一行,分隔符用逗號(hào);continue回到循環(huán)頭,break退出循環(huán),嵌套循環(huán)中都作用最內(nèi)層循環(huán);錯(cuò)誤控制語句try?catch?end執(zhí)行時(shí),try?catch范圍內(nèi)出現(xiàn)錯(cuò)誤可轉(zhuǎn)到代碼段catch?end做出響應(yīng),若此段還有錯(cuò)誤則結(jié)束程序執(zhí)行;return語句可強(qiáng)制結(jié)束當(dāng)前運(yùn)行的程序。Page 179: 腳本(scripts)與函數(shù)的區(qū)別:腳本簡單執(zhí)行一系列語句和需多次運(yùn)行的文件,不能接受輸入?yún)?shù)也不返回輸出結(jié)果,變量保存在基本工作區(qū);函數(shù)有定義語句function,有輸入輸出,變量有單獨(dú)工作區(qū);輸出用[],輸入用()。
Page 181: 默認(rèn)下M文件名與第一個(gè)函數(shù)名相同,若不同需用文件名引用函數(shù);用exist函數(shù)識(shí)別是否為M文件函數(shù),非0則是;用which函數(shù)找到M文件函數(shù)的源碼;
《MATLAB程序設(shè)計(jì)與應(yīng)用》
Page 242: 在M-book 中,在word與MATLAB之間進(jìn)行傳遞的內(nèi)容稱為單元(Cell),輸入輸出是指對(duì)MATLAB而言;m-book最重要的操作就是輸入單元的定義與執(zhí)行,其方法是:先在文檔中輸入命令后選中命令行,再按組合鍵Alt + D(=Define Input Cell),則命令行變成綠色的輸入單元,然后按組合鍵Ctrl + Enter(=Evaluate Cell),執(zhí)行后產(chǎn)生藍(lán)色的輸出單元;也可選中命令行后直接按組合鍵Ctrl + Enter輸入并執(zhí)行;注意:命令和標(biāo)點(diǎn)須在英文狀態(tài)下輸入,MATLAB的續(xù)行符不能用于m-book,它會(huì)自動(dòng)換行無需加回車符,修改后執(zhí)行新結(jié)果會(huì)覆蓋掉老結(jié)果。
Page 247: 可用evaluate loop實(shí)現(xiàn)單元的循環(huán)執(zhí)行,用purge output cells刪去選中的輸出單元,用undefine cells把單元轉(zhuǎn)換為文本;輸出格式控制包括輸出數(shù)據(jù)控制和圖形控制,可通過notebook->notebook options->embed figures in m-book是否選中控制輸出圖形是否鑲嵌在m-book文檔中;若輸出圖形背景色不是白色可在MATLAB命令窗口運(yùn)行whitebg('white')再重新運(yùn)行輸入單元;可通過“樣式和格式”修改Output等的樣式。Page 251: Simulink主要對(duì)動(dòng)態(tài)系統(tǒng)進(jìn)行建模、仿真和分析,提供圖形用戶界面GUI,用戶可用鼠標(biāo)從模塊庫中調(diào)用標(biāo)準(zhǔn)模塊并適當(dāng)連接以建模同時(shí)用參數(shù)對(duì)話框設(shè)置參數(shù),建模后選擇仿真參數(shù)和數(shù)值算法便可啟動(dòng)仿真程序?qū)ο到y(tǒng)仿真;simulink仿真模型表現(xiàn)為方框圖,其擴(kuò)展名為.mdl,數(shù)學(xué)上體現(xiàn)了一組微分方程或差分方程,通常包含3類模塊:信源(source)、系統(tǒng)(system)、信宿(sink儀器);可用format菜單調(diào)整模塊方向,改變模塊前景色、背景填充色或者模型背景色,產(chǎn)生陰影效果等,處理模塊名,給連線加標(biāo)志;模型連接須從一個(gè)模塊的輸出端連到另一個(gè)模塊的輸入端,默認(rèn)是折線要用斜線需選中連線再按住shift鍵拖動(dòng);連線分支操作是鼠標(biāo)移到分支點(diǎn)位置先按下ctrl鍵再拖動(dòng)到目標(biāo)模塊的輸入端;選定模塊后再用模型編輯窗口edit菜單可設(shè)置模塊參數(shù),模塊屬性等。
Page 265: 系統(tǒng)仿真過程中,事先須對(duì)仿真算法、輸出模式等仿真參數(shù)進(jìn)行設(shè)置,方法是:從模型編輯窗口simulation菜單中選擇configuration parameters命令打開仿真參數(shù)對(duì)話框設(shè)置仿真參數(shù);設(shè)置仿真參數(shù)完后,從simulation菜單中選擇start項(xiàng)便可啟動(dòng)當(dāng)前模型的仿真,此時(shí)stop命令變成可選以供中途停止;為觀察仿真結(jié)果變化軌跡可以:把輸出結(jié)果送給scope模塊或者XY graph模塊,把仿真結(jié)果送到輸出端口并作為返回變量后用MATLAB命令繪制該變量變化曲線,把輸出結(jié)果送到to workspace模塊從而直接存入工作空間后用繪圖命令繪制出變量變化曲線;系統(tǒng)仿真步驟如下:建立系統(tǒng)仿真模型包括添加模塊、設(shè)置模塊參數(shù)以及進(jìn)行模塊連接等操作,設(shè)置仿真參數(shù),啟動(dòng)仿真并分析仿真結(jié)果。
Page 134: 要在MATLAB中使用其他軟件的圖象需用[x,c]=imread(filename,fmt)讀取該圖象,其圖像通常由數(shù)據(jù)矩陣x和色彩矩陣c組成,真彩色圖像的數(shù)據(jù)矩陣為三維,三個(gè)面上數(shù)據(jù)分別是RGB三種顏色的強(qiáng)度值,每個(gè)元素對(duì)應(yīng)圖像中一個(gè)像素點(diǎn);可用colormap(c)函數(shù)設(shè)置色圖;影片動(dòng)畫制作有三個(gè)函數(shù):moviein(n)建立一個(gè)足夠大的n列矩陣,a(:,n)=getframe將n幅畫面信息保存矩陣a中,movie(a,m)播放由矩陣a定義的畫面m次;實(shí)時(shí)動(dòng)畫制作是先畫出初始圖形,再計(jì)算活動(dòng)對(duì)象新位置并顯示新對(duì)象擦除舊對(duì)象,可通過EraseMode屬性實(shí)現(xiàn)一般選Xor,只繪制與屏幕顏色不一致的原對(duì)象點(diǎn);可通過改變數(shù)據(jù)屬性來重新繪圖,沒改變一次就應(yīng)用drawnow命令刷新屏幕一次。
Page 311: mat文件是MATLAB數(shù)據(jù)存儲(chǔ)的默認(rèn)文件格式,以雙精度二進(jìn)制格式保存數(shù)據(jù),它由128字節(jié)的文件頭和其后的數(shù)據(jù)單元組成;MATLAB提供了一個(gè)子程序庫使用戶可以在C/C++,FORTRAN中直接調(diào)用這些子程序來創(chuàng)建和讀取mat文件;操作mat文件的API函數(shù)封裝于兩個(gè)標(biāo)準(zhǔn)庫文件:libmat.lib和libmx.lib,存放在binwin32相應(yīng)子文件夾中,在externinclude中有與前面兩個(gè)庫文件對(duì)應(yīng)的.def文件:libmat.def,libmx.def,其導(dǎo)出函數(shù)原型位于同目錄下的mat.h,matrix.h中,前者包含mat文件的創(chuàng)建讀寫等函數(shù)的定義,后者包含MATLAB中基本數(shù)據(jù)類型和矩陣的定義;在FORTRAN語言中mat文件操作函數(shù)有:matOpen(filename,mode), matClose(mfp), matDeleteVariable(mfp,name), matGetDir(mfp,name), matPutVariable(mfp,name,pm), matGutVariable(mfp,name,pm), matPutVariableAsGlobal(mfp,name,pm),其中mfp為指向mat文件的指針,name是讀寫mat文件的矩陣名稱,num為矩陣數(shù)目,pm是mxArray結(jié)構(gòu)體指針,mode為打開文件方式。Page 315: MATLAB編譯器(MCC)可將m語言編寫的函數(shù)文件(腳本文件不行)轉(zhuǎn)換成C/C++源代碼,經(jīng)編譯鏈接后可生成函數(shù)庫、可執(zhí)行程序、COM組件等,從而提高程序執(zhí)行效率豐富程序開發(fā)手段并隱藏算法源代碼;使用MCC需安裝MATLAB和一種C/C++編譯器,如VC++6.0,要生成獨(dú)立應(yīng)用程序需安裝相應(yīng)數(shù)學(xué)庫和圖形庫;編譯器配置即執(zhí)行命令:mbuild –setup 后按提示選取一種編譯器(通常安裝VC++6.0后選擇它)生成批處理文件并注冊(cè)相關(guān)dll文件,mbuild通過調(diào)用外部的C/C++編譯器把M文件翻譯成C/C++源代碼然后與MATLAB的C/C++數(shù)學(xué)庫、圖形庫鏈接得到獨(dú)立可執(zhí)行程序;執(zhí)行命令為:mcc –m –I /files_source(源文件路徑)–d /files_target(目標(biāo)文件路徑)*.m ;離開MATLAB執(zhí)行exe文件時(shí)要把生成的所有文件包括相應(yīng)庫文件全部帶上。
Page 319: MATLAB提供了客戶/服務(wù)器(Client/Server,C/S)功能,利用動(dòng)態(tài)數(shù)據(jù)交換(DynamicDataExchange,DDE)功能和ActiveX自動(dòng)化服務(wù)功能,可以實(shí)現(xiàn)在其他程序中對(duì)MATLAB程序及函數(shù)的調(diào)用,且通過mxArray與工作空間交換數(shù)據(jù),從而增強(qiáng)其他語言的數(shù)值計(jì)算能力和數(shù)據(jù)可視化能力;MATLAB引擎是一組函數(shù)庫,他提供了一種在用戶程序進(jìn)程中與MATLAB進(jìn)程通信的方法,在WINDOWS下使用ActiveX技術(shù)實(shí)現(xiàn),使用組件對(duì)象模型(ComponentObjectModel,COM)接口;C語言MATLAB計(jì)算引擎包括引擎函數(shù)和mx-函數(shù)兩類,常用引擎函數(shù)有engOpen, engClose, engGetVariable, engPutVariable, engEvalString等,mx-函數(shù)的具體用法參見幫助文件中section為External Interfaces Reference部分;引擎編程首先要將mxArray轉(zhuǎn)換成MATLAB中可操作的形式,將源程序編寫存盤后再用mex命令對(duì)源程序文件進(jìn)行編譯,注意源文件中不能有中文(即使是注釋);mex用來編譯簡單文件合適,但工程復(fù)雜時(shí)需在VC++6.0的集成環(huán)境中編譯鏈接。
Page 324: 常用FORTRAN引擎函數(shù)有engOpen(startcmd), engClose(ep), engGetVariable(ep,name), engPutVariable(ep,name,pm), engEvalString(ep,command)等,其中startcmd 為引擎參數(shù)(字符型),ep為引擎指針(整型),name為矩陣名,pm為mxArray矩陣指針,command為MATLAB命令;在MATLAB命令窗口使用的編譯命令是optsfile=[matlabroot 'binwin32mexoptsdf60engmatopts.bat'];mex('-f',optsfile,'*.f90');但有時(shí)候沒有df60engmatopts.bat文件,這時(shí)候需在VisualFortran的集成環(huán)境中編譯鏈接;可先用VF打開該f90文件然后選Tools->Options->Directories,在Include files中添加matlabrootexterninclude,在Library files中添加externlibwin32microsoft,然后選Project->Settings->Link,在Object modules中添加libmx.lib libmat.lib libeng.lib,再用默認(rèn)的編譯鏈接可生成可執(zhí)行文件*.exe。
Page 325: MEX(MATLAB executable)動(dòng)態(tài)鏈接函數(shù)接口使MATLAB可直接調(diào)用C,FORTRAN語言編寫的算法程序,應(yīng)用如下:對(duì)已有的C,FORTRAN子程序通過添加入口程序mexFunction可由MATLAB調(diào)用而不必重編M文件,可把要求大量循環(huán)迭代的部分用C語言編寫為MEX文件提高計(jì)算速度,直接控制硬件如數(shù)據(jù)采集卡等;MEX文件優(yōu)于M文件執(zhí)行,用C語言編寫MEX文件的特點(diǎn)是編程靈活指針功能強(qiáng),但應(yīng)注意C和MATLAB中數(shù)據(jù)存儲(chǔ)方式的差別,其源程序包括兩部分:入口子程序(作用是建立通信聯(lián)系),計(jì)算子程序(可是普通的C程序),注意都要包括頭文件mex.h;可在命令窗口輸入mex filename.c編譯MEX程序,但在VC環(huán)境下更好,項(xiàng)目類型為Win32 Dynamic-link library,(設(shè)置環(huán)境和參數(shù)都較麻煩)編譯鏈接無誤后產(chǎn)生*.dll,運(yùn)行時(shí)會(huì)自動(dòng)打開新的MATLAB應(yīng)用程序。
Page 330: FORTRAN語言數(shù)值計(jì)算功能強(qiáng)但指針功能弱,其MEX文件同樣由入口子程序和計(jì)算子程序組成,它只支持雙精度類型和字符串類型的數(shù)據(jù);mexFunction()中參數(shù)的意義和C語言一樣,入口子程序也和C語言大體相同,編譯時(shí)先輸入命令mex –setup選擇DigitalVisualFortran6.0作為默認(rèn)編譯器,有些MATLAB軟件里沒有(如我的只能用VC++);集成環(huán)境中編譯步驟如下:新建一個(gè)項(xiàng)目類型為FortranDynamicLinkLibrary,選Project->Add to project->new->Text file創(chuàng)建與項(xiàng)目同名的定義文件(*.def),選Tools->options->directories-> include files添加externinclude,library files添加libwin32digitaldf60,選project->settings-> output file name輸入*.dll,Object modeles增加libmx.lib,libmex.lib,將文件加入到項(xiàng)目中再進(jìn)行編譯鏈接,可生成*.dll;將MATLAB數(shù)據(jù)接口和其他開發(fā)環(huán)境結(jié)合可充分發(fā)揮數(shù)值計(jì)算長處避開執(zhí)行效率低的不足,MATLAB還提供了與excel中數(shù)據(jù)交互的工具箱、VB算法庫及MATLABwebServer可通過HTTP協(xié)議在安裝了web服務(wù)器主機(jī)上提供MATLAB計(jì)算遠(yuǎn)程服務(wù),硬件操作方面MATLAB提供了串行通信對(duì)象操縱串行口并可通過mex程序調(diào)用設(shè)備驅(qū)動(dòng)程序。《MATLAB7.x程序設(shè)計(jì)語言》
Page 266: 建立多維數(shù)組有四種方法:利用下標(biāo)建立,如2×2的矩陣也可看作是2×2×1的數(shù)組可擴(kuò)展維數(shù),標(biāo)量輸入表示擴(kuò)展維元素均相同;利用特殊數(shù)組函數(shù)(如rand, randn, ones等)可直接產(chǎn)生多維數(shù)組,也可用repmat(A,m,n)直接產(chǎn)生;利用cat(n,A,B)連接A,B矩陣,n為指定維數(shù),連接時(shí)是最后一維變化;編寫M文件將記錄組合成多維數(shù)組;ndims獲得維數(shù),size得到各維尺寸,whos得到數(shù)組存儲(chǔ)格式。
Page 269: 多維陣列(即數(shù)組)的下標(biāo)訪問即采用各維的下標(biāo)訪問其元素,可用向量來表示多個(gè)元素,: 表示其他維固定該維變化的所有元素還可用a:b取出部分元素;陣列重新排列可用reshape函數(shù)按列重排,用squeeze函數(shù)刪除單點(diǎn)維(尺寸size為1的維);序列變換可用permute函數(shù)改變指定維次序。
Page 272: 面向向量的函數(shù)(如sum,mean,prod等)通常在第一個(gè)非單點(diǎn)維上操作且允許指定的維,也有例外如cross函數(shù);元素對(duì)元素的操作函數(shù)(如三角、指數(shù)函數(shù)等)對(duì)每個(gè)元素進(jìn)行同樣操作,算術(shù)、邏輯、關(guān)系操作符也按元素對(duì)元素方式處理,有一個(gè)為標(biāo)量則對(duì)陣列所有元素與該標(biāo)量進(jìn)行同樣操作;面向矩陣的函數(shù)(如線性代數(shù)函數(shù))不能用于多維陣列,需從中取出維數(shù)為2的一部分進(jìn)行操作;RGB(m,n,3)的三色原理Color=0.3*RGB(:,:,1)+0.59*RGB(:,:,2)+0.11*RGB(:,:,3)。Page 273: 結(jié)構(gòu)陣列由多個(gè)域構(gòu)成,不同域可存放不同類型的數(shù)據(jù),可用結(jié)構(gòu)名(下標(biāo)).域名對(duì)結(jié)構(gòu)陣列賦值;用結(jié)構(gòu)名顯示結(jié)構(gòu)信息,只有一個(gè)結(jié)構(gòu)元素顯示各元素值,可用rmfield函數(shù)刪除錯(cuò)誤域名;用struct函數(shù)可產(chǎn)生一個(gè)結(jié)構(gòu)元素的結(jié)構(gòu)數(shù)組,再利用單元數(shù)組{}可輸入多個(gè)結(jié)構(gòu)元素;訪問結(jié)構(gòu)數(shù)組中的元素可用下標(biāo),利用getfield(結(jié)構(gòu)名,{下標(biāo)},’域名’,{a:b,c:d})可得到域的部分值(域元素),利用setfield函數(shù)可改變結(jié)構(gòu)的域值。Page 277: MATLAB函數(shù)和操作符可用于結(jié)構(gòu)數(shù)組中的域和域元素,可用循環(huán)來完成指定功能,還可對(duì)同名域的數(shù)據(jù)用函數(shù)直接處理;結(jié)構(gòu)陣列的數(shù)據(jù)組織方式有平面組織和元素對(duì)元素組織等,如對(duì)三個(gè)獨(dú)立存儲(chǔ)矩陣,平面組織方式下每個(gè)域是一個(gè)平面的數(shù)據(jù)(矩陣),這樣容易提取平面數(shù)據(jù)并擴(kuò)展平面?zhèn)€數(shù),訪問子集時(shí)稍麻煩,元素對(duì)元素組織結(jié)構(gòu)的建立需用循環(huán),訪問子集較容易但訪問平面還要用循環(huán);結(jié)構(gòu)陣列的域值可以是另一個(gè)已定義過的結(jié)構(gòu),即結(jié)構(gòu)嵌套,如用struct建立一個(gè)結(jié)構(gòu)元素再用賦值語句*.原域名.域名擴(kuò)展。
Page 282: 單元陣列中每個(gè)單元可以是標(biāo)量、向量、矩陣、字符陣列、結(jié)構(gòu)陣列、多維陣列等,在建立單元陣列之前應(yīng)確保不存在同名數(shù)值陣列否則會(huì)導(dǎo)致錯(cuò)誤;對(duì)單元陣列賦值時(shí)應(yīng)使用花括號(hào),放左邊較方便,可用cell(m,n,?)預(yù)分配空單元陣列;顯示單元數(shù)組可直接輸入數(shù)組名顯示單元信息,也可采用celldisp函數(shù)顯示詳細(xì)信息和cellplot函數(shù)顯示存儲(chǔ)結(jié)構(gòu)圖形;使用單元陣列數(shù)據(jù)也用下標(biāo)訪問但注意括號(hào),訪問一個(gè)單元用花括號(hào),訪問單元中的元素和部分單元用圓括號(hào);刪除元素也用賦空值,如A(:,2)=[]后A可能成了一維單元陣列。
Page 285: 花括號(hào)內(nèi)采用冒號(hào)操作符相當(dāng)于指示多個(gè)獨(dú)立的單元內(nèi)容如A{m:n},形如[a{1};a{2}]可構(gòu)造數(shù)值陣列;可用單元數(shù)組代替函數(shù)輸入、輸出、顯示操作等的變量列表,如[a{1:2}]=eig(B)此時(shí)a{1}為特征向量(模態(tài))矩陣a{2}為特征值(規(guī)范)矩陣;利用下標(biāo)可將函數(shù)和操作符應(yīng)用于單元陣列,用循環(huán)可對(duì)所有單元進(jìn)行處理;單元陣列比結(jié)構(gòu)陣列更具包容性,它可在一條賦值語句中訪問多個(gè)數(shù)據(jù)域,如使用[a,b]=c{1:2}相當(dāng)于a=s.f1;b=s.f2其中c為單元陣列,s為等價(jià)結(jié)構(gòu)陣列;利用花括號(hào)、cell函數(shù)及賦值語句可建立嵌套的單元陣列,不用cell函數(shù)預(yù)分配完全可以但賦值系統(tǒng)會(huì)花更多時(shí)間;單元陣列與數(shù)值陣列之間的轉(zhuǎn)換應(yīng)采用循環(huán)程序,num2cell可實(shí)現(xiàn)數(shù)值到單元。
Page 290: 多維單元數(shù)組可利用cat函數(shù)連接產(chǎn)生,如A,B為2×2的單元數(shù)組則可用cat(3,A,B)生成2×2×2的多維單元數(shù)組;多維結(jié)構(gòu)數(shù)組可利用直接賦值或cat函數(shù)產(chǎn)生,定義后可用結(jié)構(gòu)的域名來訪問還可對(duì)其數(shù)據(jù)應(yīng)用函數(shù)和操作符;利用單元數(shù)組還可將具有不同域結(jié)構(gòu)的結(jié)構(gòu)數(shù)組存儲(chǔ)在一起,每個(gè)單元為一個(gè)結(jié)構(gòu)數(shù)組;多維數(shù)值陣列適用于規(guī)則數(shù)據(jù),結(jié)構(gòu)陣列適用于不一致的數(shù)據(jù),單元陣列可用于任意數(shù)據(jù)混合;一般結(jié)構(gòu)名首字母大寫,單元數(shù)組名大寫,其余名稱小寫,較復(fù)雜的數(shù)據(jù)庫用單元中有結(jié)構(gòu),結(jié)構(gòu)中有數(shù)值和字符的形式。
Page 314: MATLAB中字符以其ASCII碼表示,每個(gè)字符都采用16位的ASCII碼存儲(chǔ),字符串即一維字符數(shù)組;double函數(shù)可把字符串中每個(gè)字符轉(zhuǎn)變成ASCII碼,char函數(shù)可把ASCII碼數(shù)組轉(zhuǎn)變成對(duì)應(yīng)字符串;建立二維字符數(shù)組時(shí)應(yīng)注意確保每行上的字符數(shù)相等,方法是先disp每行字符串的長度length()后用blanks函數(shù)在較短的字符串末尾補(bǔ)上空格;從字符數(shù)組中提取字符串時(shí),可用deblank函數(shù)刪除末尾多余的空格;利用cellstr函數(shù)可將字符數(shù)組變換成字符串單元數(shù)組,每個(gè)單元均為字符串且已刪除末尾空格,利用char函數(shù)可進(jìn)行其逆操作,且可自動(dòng)在每行末尾加上適當(dāng)空格。
Page 317: 比較兩字符串是否完全相同用strcmp函數(shù),strcmpi函數(shù)比較時(shí)忽略大小寫,strncmp函數(shù)比較兩字符串前n個(gè)字符是否相同,相同時(shí),返回邏輯真,值為1不同為0;可用MATLAB關(guān)系操作符逐字比較兩個(gè)字符串是否相同或大小關(guān)系,采用的是ASCII碼,表達(dá)式為真值為1;可用isletter函數(shù)逐字比較字符串是否全由字母構(gòu)成,是則為1,isspace函數(shù)逐字比較字符串是否有空格,還可用或操作符檢測(cè)字符串是否全由字母和空格構(gòu)成。Page 319: 利用findstr和strrep函數(shù)可實(shí)現(xiàn)字符串中部分字符的搜索與替代;用strtok函數(shù)可找出第一個(gè)分隔符之前的字符串,若有n個(gè)單詞可用循環(huán)和array=strvcat(string,n)從英文句子中提取單詞;MATLAB提供了一組函數(shù)如int2str,num2str,bin2dec,hex2dec,base2dec等在各種數(shù)制和字符串之間進(jìn)行變換;只有用num2str函數(shù)才可將含小數(shù)的數(shù)值變換成字符串如在圖形標(biāo)記中使用數(shù)值,用mat2str函數(shù)可將矩陣變換成字符串形式。