MATLAB的數(shù)據(jù)結構
MATLAB 語言的賦值語句有兩種:
- 變量名 = 運算表達式
- [返回變量列表] = 函數(shù)名(輸入變量列表)
MATLAB 支持變量和常量,其中 pi 為圓周率 p, 更重要的,MATLAB 支持 IEEE 標準的運算符號,如 Inf 表示無窮大,NaN (Not a Number) 為 0/0, 0*Inf 或 Inf/Inf 等運算結果。MATLAB 變量名應該由字母引導,后面可以跟數(shù)字、字母或下劃線等符號。MATLAB 是區(qū)分變量名字母大小寫的。
(1) 矩陣
MATLAB 最基本的數(shù)據(jù)結構是復數(shù)矩陣。輸入一個復數(shù)矩陣是很簡單的事。例如可以給出下面的語句:
>> B=[1+9i,2+8i,3+7j; 4+6j 5+5i,6+4i; 7+3i,8+2j 1i]
其中 >> 為 MATLAB 的提示符。矩陣各行元素由分號分隔,而同行不同元素由逗號或空格分隔。給出了上面的命令,則可以給出下面的結果。
其中,元素 1+9i 表示復數(shù)項。有這樣的表述方法,實矩陣、向量或標量均可以更容易地輸入了。如果賦值表達式末尾有分號,則其結構將不顯示,否則將顯示出全部結果。
MATLAB 和其他語言不同,它無需事先聲明矩陣的維數(shù)。下面的語句可以建立一個更大的矩陣
冒號表達式是 MATLAB 里最具特色的表示方法。其調(diào)用格式為 a=s1:s2:s3; 這一語句可以生成一個行向量,其中 s1 為向量的起始值,s2 為步距,而 s3 為向量的終止值。例如 S=0:.1:2*pi; 將產(chǎn)生一個起始于 0, 步距為 0.1, 而終止于 6.2 的向量 (pi 為 MATLAB 保留常量p), 而不是終止于2p。如果寫成 S=0:-0.1:2*pi; 則不出現(xiàn)錯誤,而返回一個空向量。
冒號表達式可以用來提取矩陣元素,例如 B(:,1) 將提取 B 矩陣的第 1 列而 B(1:2,1:2:3) 將提取 B 的前 2 行與 1,3,5 列組成的子矩陣。在矩陣提取時還可以采用end 這樣的算符。如 B(2:end,:) 將提取 B 矩陣的后 2 列構成的子矩陣。
(2) 多維數(shù)組
多維數(shù)組是 MATLAB 在其 5.0 版本開始提供的。假設有 2 個 3x3 矩陣 A1, A23,則可以由下面的命令建立起一個 3x3x2 的數(shù)組:A=cat(3,A1,A2)。試驗 A1=cat(2,A1,A2) 和 A2=cat(1,A1A2) 將得到什么結果。
對矩陣或多維數(shù)組 A 可以使用 size(A) 來測其大小,也可以使用 reshape() 函數(shù)重新按列排列。對向量來說,還可以用 length(A) 來測其長度。
不論原數(shù)組 A 是多少維的,A(:) 將返回列向量。
(3) 字符串與字符串矩陣
MATLAB 的字符串是由單引號括起來的。如可以使用下面的命令賦值
>> strA='This is a string.'
多個字符串可以用 str2mat() 函數(shù)構造出字符串矩陣。如 B=str2mat(strA, 'ksa saj','aa');字符串變量可以由下表中的命令進行操作:
| 命令 | 意義 | 命令 | 意義 |
| strcmp(A,B) | 比較A和B字符串是否相同。 | findstr(A,B) | 測試A是否為B的子字符串,或反過來 |
| strrep(A,s1,s2) | 在A中用s2替換s1 | length(A) | 字符串A的長度 |
| deblank(A) | 刪除A字符串尾部的空格 | double(A) | 字符串轉換雙精度數(shù)據(jù) |
(4) 單元數(shù)據(jù)結構
用類似矩陣的記號將給復雜的數(shù)據(jù)結構納入一個變量之下。和矩陣中的圓括號表示下標類似,單元數(shù)組由大括號表示下標。
訪問單元數(shù)組應該由大括號進行,如第 4 單元中的元素可以由下面的語句得出
(5) 結構體
MATLAB 的結構體有點象 C 語言的結構體數(shù)據(jù)結構。每個成員變量用點號表示,如 A.p 表示 A 變量的 p 成員變量。獲得該成員比 C 更直觀,仍用 A.p 訪問,而不用 A->p。用下面的語句可以建立一個小型的數(shù)據(jù)庫。
其中 test 成員為單元型數(shù)據(jù)。刪除成員變量可以由 rmfield() 函數(shù)進行,添加成員變量可以直接由賦值語句即可。另外數(shù)據(jù)讀取還可以由 setfield 和 getfield 函數(shù)完成。
(6) 類與對象
類與對象是 MATLAB 5.* 開始引入的數(shù)據(jù)結構。在 MATLAB 手冊中定義了一各很好的類 -- 多項式類。該例子值得細讀,去體會類和對象的定義,重載函數(shù)編寫等信息。事實上,在實際工具箱設計中,用到了很多的類,例如在控制系統(tǒng)工具箱中定義了 LTI (線性時不變系統(tǒng)) 類,并在此基礎上定義了其子類:傳遞函數(shù)類 TF, 狀態(tài)方程類 SS, 零極點類 ZPK 和頻率響應類 FR。
舉例:我們將通過一個例子來介紹類的構造。 在 MATLAB 語言使用手冊中給出了一個很有代表性的例子:多項式類的建立問題。假設我們想為多項式建立一個單獨的類,重新定義加、減、乘及乘方等運算,并定義其顯示方式。那么建立一個類至少應該執(zhí)行下面的步驟:(這個例子更詳細的情況請參考 MATLAB 手冊)
- 首先應該選定一個恰當?shù)拿郑邕@里的多項式類可選擇為 polynom。
- 以這個名字建立一個子目錄,目錄的名字前加 @。對本例來說,即應該在當前的工作目錄下建立 @polynom 子目錄,而這個目錄無需在 MATLAB 路徑下再指定。
- 編寫一個引導函數(shù),函數(shù)名應該和類同名。定義類的使用方法:
function p = polynom(a)
if nargin == 0
p.c = []; p = class(p,'polynom');
elseif isa(a,'polynom'), p = a;
else,
p.c = a(:).'; p = class(p,'polynom');
end
可以看出,本函數(shù)分三種情況加以考慮:
① 如果不給輸入變量,則建立一個空的多項式;
② 如果輸入變量 a 已經(jīng)為多項式類,則將它直接傳送給輸出變量 p;
③ 如果 a 為向量,則將此向量變換成行向量,再構造成一個多項式對象。 - 如果想正確地顯示新定義的類,則必需首先定義 display() 函數(shù),并對新定義的類重新定義其基本運算。對多項式來說,我們可以如下定義有關的函數(shù):
- 要改變顯示函數(shù)的定義,則需在此目錄下重新建立一個新函數(shù) display()。這種重新定義函數(shù)的方法又稱為函數(shù)的重載。顯示函數(shù)可以如下地重載定義。
function display(p)
disp(' '); disp([inputname(1),' = '])
disp(' '); disp([' ' char(p)]); disp(' ');
注意,這里應該定義的是 display() 而不是 disp()。 - 從上面的定義可見,顯示函數(shù)要求重載定義 char() 函數(shù),用于把多項式轉換成可顯示的字符串。 該函數(shù)的定義為
function s=char(p)
if all(p.c==0), s ='0';
else
d=length(p.c)-1; s=[];
for a=p.c;
if a~=0;
if~isempty(s)
if a>0, s=[s, ' + '];
else, s=[s, ' - ']; a = -a; end
end
if a~=1 | d==0, s=[s, num2str(a)];
if d>0, s=[s, '*']; end
end
if d>=2, s=[s, 'x^', int2str(d)];
elseif d==1, s=[s 'x']; end
end
d=d-1;
end, end - 仔細研究此函數(shù),可以發(fā)現(xiàn),該函數(shù)能自動地按照多項式顯示的格式構造字符串。比如,多項式各項用加減號連接,系數(shù)與算子之間用乘號連接,而算子的指數(shù)由 ^ 表示。再配以顯示函數(shù),則可以將此多項式以字符串的形式顯示出來。
- 雙精度處理:雙精度轉換函數(shù)的重載定義是很簡單的。
function c = double(p)
c = p.c; - 加運算:兩個多項式相加,只需將其對應項系數(shù)相加即可。這樣,加法運算的重載定義
可由下面的函數(shù)實現(xiàn)。注意,這里要對 plus() 函數(shù)進行重載定義。
function p=plus(a,b)
a=polynom(a); b=polynom(b);
k=length(b.c)-length(a.c);
p=polynom([zeros(1,k) a.c]+[zeros(1,-k) b.c]);
同理,還可以重載定義多項式的減法運算:
function p=minus(a,b)
a=polynom(a); b=polynom(b);
k=length(b.c)-length(a.c);
p=polynom([zeros(1,k) a.c]-[zeros(1,-k) b.c]); - 乘法運算:多項式的乘法實際上可以表示為系數(shù)向量的卷積,可以由 conv() 函數(shù)直接獲得。 故可以如下重載定義多項式的乘法運算。
function p=mtimes(a,b)
a=polynom(a); b=polynom(b); p=polynom(conv(a.c,b.c)); - 乘方運算: 多項式的乘方運算只限于正整數(shù)乘方的運算,其 n 次方相當于將該多項式自乘 n 次。若 n=0,則結果為 1。 這樣我們就可以重載定義多項式的乘方運算為:
function p=mpower(a,n)
if n>=0, n=floor(n); a=polynom(a); p=1;
if n>=1,
for i=1:n, p=p*a; end
end
else, error('Power should be a non-negative integer.')
end - 多項式求值問題:可以對多項式求值函數(shù) polyval() 進行重載定義。
function y=polyval(a,x)
a=polynom(a); y=polyval(a.c,x);
定義了此類之后,我們就可以方便地進行多項式處理了。例如我們可以建立兩個多項式對象 P(s)=x^3+4x^2-7 和 Q(s)=5x^4+3x^3-1.5x^2+7x+8 其相應的~MATLAB 語句為
>> P=polynom([1,4,0,-7]), Q=polynom([5,3,-1.5,7,8])
P =
x^3 + 4*x^2 - 7
Q =
5*x^4 + 3*x^3 - 1.5*x^2 + 7*x + 8
然后調(diào)用下面函數(shù)就可以得出相應的計算結果
>> P+Q
ans =
5*x^4 + 4*x^3 + 2.5*x^2 + 7*x + 1
>> P-Q
ans =
-5*x^4 - 2*x^3 + 5.5*x^2 - 7*x - 15
>> P*Q
ans =
5*x^7 + 23*x^6 + 10.5*x^5 - 34*x^4 + 15*x^3 + 42.5*x^2 - 49*x - 56
>> X=P^3
X =
x^9 + 12*x^8 + 48*x^7 + 43*x^6 - 168*x^5-336*x^4+147*x^3+588*x^2-343
>> y=polyval(X,[1 2 3 4 5 6])
y =
-8 4913 175616 1771561 10360232 43986977
由于前面的重載定義,下面的表達式也能得出期望的結果
>> P+[1 2 3]
ans =
x^3 + 5*x^2 + 2*x - 4 - 使用 methods() 函數(shù)可以列出一個新的類已經(jīng)定義的方法函數(shù)名。
>> methods('polynom')
Methods for class polynom:
char double mpower plus polyval
display minus mtimes polynom
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















