在MATLAB編程中,經(jīng)常需要遇到一些特殊的通用矩陣,本篇主要介紹的是MATLAB中可能會用到特殊矩陣。
1、零矩陣
MATLAB使用zeros函數(shù)來創(chuàng)建零矩陣,所謂零矩陣就是矩陣中所有元素皆為0的矩陣。zeros函數(shù)的調(diào)用方式如下所示:
(1)zeros(n):n為常數(shù),生成一個n×n的矩陣。
例如,生成一個4×4的零矩陣的代碼為:
a=zeros(4)
運行結(jié)果如下所示:
a =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
當n的值省略的時候,那么生成一個1×1的向量,結(jié)果如下所示:
ans =
0
(2)zeros(m,n):m,n均為常數(shù),生成一個m×n的零矩陣。生成一個m×n的零矩陣也可以寫成zeros([m,n])的方式。
例如生成一個3×4的零矩陣的代碼如下:
a=zeros(3,4)
運行結(jié)果如下所示:
a =
0 0 0 0
0 0 0 0
0 0 0 0
(3)zeros(size(A)):A為矩陣,zeros生成一個與矩陣A相同行和列的零矩陣。
例如:
A=[3,4,5;2,7,8];
a=zeros(size(A))
運行結(jié)果如下所示:
a =
0 0 0
0 0 0
(4)zeros(m,n,'like',p):p為矩陣,生成一個與p類型相同,大小為m行n列的零矩陣。
例如:
p=[2+1i,3;4,2+3i];
zeros(3,2,'like',p)
在上述代碼段中的p矩陣為一個復(fù)數(shù)矩陣,那么matlab中所求的結(jié)果應(yīng)為一個3行2列的復(fù)數(shù)矩陣。運行結(jié)果如下所示:
ans =
0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i
(5)zeros(m,n,typename):生成一個m行n列的矩陣,其中矩陣的中所有元素的類型通過typename指定的。
例如,生成一個3行4列的int類型的矩陣代碼如下所示:
a=zeros(3,4,'int16')
運行結(jié)果如下所示:
a =
3×4 int16 矩陣
0 0 0 0
0 0 0 0
0 0 0 0
在例如,生成一個3行4列的logical類型的矩陣代碼如下所示:
a=zeros(4,4,'logical')
運行結(jié)果如下如所示:
a =
4×4 logical 數(shù)組
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
在typename中可以選擇的值包括:'double'、'single'、‘logical’、‘int8‘、’int16‘、'int32'、’uint8‘、'uint16'、’uint32‘或者是zeros函數(shù)支持的其他類的名稱。
(5)flase函數(shù)
在MATLAB中,false函數(shù)用于生成全為0的邏輯矩陣。
例如,生成一個3行4類的全0邏輯矩陣,代碼如下所示:
a=false(3,4)
運行結(jié)果如下所示:
a =
3×4 logical 數(shù)組
0 0 0 0
0 0 0 0
0 0 0 0
需要注意的是,false(3,4)和zeros(3,4,'logical')所達成的效果是相同的。
2、幺矩陣
在線性代數(shù)中,矩陣中的所有元素的值全為1的矩陣的稱為幺矩陣,在MATLAB中初始化幺矩陣通常使用ones函數(shù),其中ones函數(shù)所使用的調(diào)用格式與zeros函數(shù)類似。
(1)例如,建立一個4行6列的ones函數(shù)的代碼如下所示:
a=ones(4,6)
運行結(jié)果如下所示:
a =
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
通過與zeros函數(shù)進行類比,可以對于ones函數(shù)使用相同的操作。
(2)true函數(shù)
在MATLAB中,true函數(shù)用于生成全為1的邏輯矩陣。
例如,生成一個3行4類的全1邏輯矩陣,代碼如下所示:
a=true(3,4)
運行結(jié)果如下所示:
a =
3×4 logical 數(shù)組
1 1 1 1
1 1 1 1
1 1 1 1
需要注意的是,true(3,4)和ones(3,4,'logical')所達成的效果是相同的。
3、eye函數(shù)
在MATLAB中,eye函數(shù)可以初始化單位矩陣,即對角線上元素均為1其余元素均為0的方陣。
例如初始化一個3行3列的單位矩陣代碼如下:
?
a=eye(3,3)
運行結(jié)果如下所示:
a =
1 0 0
0 1 0
0 0 1
需要注意的是,eye函數(shù)不僅可以初始化單位矩陣,同時可以初始化行和列不相同的矩陣,其中主對角線的元素全為1,其余元素均為0。例如:
a=eye(3,4)
b=eye(4,3)
運行結(jié)果如下所示:
a =
1 0 0 0
0 1 0 0
0 0 1 0
b =
1 0 0
0 1 0
0 0 1
0 0 0
4、隨機矩陣
在MATLAB中,有多個函數(shù)用于生成隨機矩陣,包括rand函數(shù)、randi函數(shù)、randn函數(shù)和randperm函數(shù):
(1)rand(m,n):生成一個m行n列的矩陣,矩陣中所有元素的值均在0-1之間。
例如初始化一個3行4列的隨機矩陣,代碼如下:
a=rand(3,4)
運行結(jié)果如下所示:
a =
0.8147 0.9134 0.2785 0.9649
0.9058 0.6324 0.5469 0.1576
0.1270 0.0975 0.9575 0.9706
(2)randi(imax,m,n):生成一個m行n列的矩陣,其中矩陣的所有元素為[1,imax]均勻分布的隨機矩陣。
例如初始化一個4行5列,元素從[1,6]之間的矩陣,代碼如下所示:
a=randi(6,4,5)
運行結(jié)果如下所示:
a =
6 3 4 5 4
3 6 1 5 2
5 5 6 5 5
1 6 6 3 1
(3)randn(m,n):生成一組3行4列的矩陣,其中矩陣中的所有元素為平均值為0、方差為1的標準正太分布隨機數(shù)。
例如,初始化一個均值為0、方差為1的4行5列的矩陣,代碼如下所示:
a=randn(4,5)
運行結(jié)果如下所示:
a =
0.6007 1.5326 1.1174 1.1006 -0.7423
-1.2141 -0.7697 -1.0891 1.5442 -1.0616
-1.1135 0.3714 0.0326 0.0859 2.3505
-0.0068 -0.2256 0.5525 -1.4916 -0.6156
(4)randperm(n,k):將[1,n]的整數(shù)隨機排列,生成一個指定長度為k的向量:
例如初始化一個長度為6,將[1,6]之間的整數(shù)隨機排列的向量:
a=randperm(6,6)
運行結(jié)果如下所示:
a =
2 1 5 3 4 6
需要注意的是randperm(n,k)中,但k的小于n時(k必須小于等于n),運行結(jié)果是隨機選取k個[1,n]的整數(shù)進行隨機排列的向量。
例如,初始化一個長度為4,將區(qū)間[1,6]的整數(shù)隨機排列的向量,代碼如下所示:
a=randperm(6,4)
運行結(jié)果如下所示:
a =
3 6 4 1
5、魔方矩陣
魔方矩陣又稱幻方、九宮格、縱橫線,是有相同的行數(shù)和列數(shù),并在每行每列、對角線上的和都相等的矩陣,其中矩陣的每一行以及每一列的和均為。魔方矩陣中的每個元素不能相同。(本段定義參考百度百科魔方矩陣)
在MATLAB中,提供magic函數(shù)來生成一個魔方矩陣,調(diào)用格式如下所示:
magic(n):生成n階的魔方矩陣。
例如生成一個4階的魔方矩陣,代碼如下所示:
a=magic(4)
運行結(jié)果如下所示:
a =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
6、范德蒙德矩陣
使用MATLAB所生成的范德蒙德矩陣中,最后一列的元素全為1,倒數(shù)第二列的元素為用戶指定的向量,而其余列是其后一列向量與倒數(shù)第二列向量的點乘積。在MATLAB中,使用vander函初始化一個范德蒙德矩陣。
例如,初始一個倒數(shù)第二行元素從上到下依次是1、3、4、7、8的5階矩陣,代碼如下:
a=vander([1,3,4,7,8])
運行結(jié)果如下所示:
a =
1 1 1 1 1
81 27 9 3 1
256 64 16 4 1
2401 343 49 7 1
4096 512 64 8 1
7、帕斯卡矩陣
帕斯卡矩陣是由展開之后系數(shù)隨n的增大組成的三角形表,又稱為楊輝三角表。其矩陣的第1行和第1列的元素均為1,其余第i行第j列的元素
。在MATLAB中使用pascal函數(shù)生成一個n階帕斯卡矩陣。
例如,生成一個5階帕斯卡矩陣,代碼如下:
a=pascal(5)
運行結(jié)果如下所示:
a =
1 1 1 1 1
1 2 3 4 5
1 3 6 10 15
1 4 10 20 35
1 5 15 35 70
同時帕斯卡矩陣可以計算的展開式中各項的系數(shù),第1至第n項的系數(shù)為從、...例如計算
的展開式的系數(shù):
a=pascal(4)
運行結(jié)果如下所示:
a =
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
則的各項系數(shù)為順著副對角線從左下角至右上角(或從右上角值左下角)各個元素的值,即:
8、托普利茲矩陣
托普利茲矩陣是矩陣第一行和第一列的元素,其他元素都是和左上角的元素相同。在MATLAB中,toeplitz(v1,v2):v1和v2分別表示托普利茲矩陣的第一列的列向量和第一行的行向量。其中v1向量和v2向量的首元素必須相同。
例如初始化化一個托普利茲矩陣:
a=toeplitz([4,3,2,6],[4,6,9,10,12])
運行結(jié)果如下所示:
a =
4 6 9 10 12
3 4 6 9 10
2 3 4 6 9
6 2 3 4 6
9、希爾伯特矩陣
希爾伯特矩陣是一個數(shù)學變化矩陣,每個元素的值,希爾伯特矩陣是個高度病態(tài)的矩陣(即任何一個元素發(fā)生變化,整個矩陣的行列式和逆矩陣都會發(fā)生巨大變化),MATLAB提供了hilb函數(shù)生成希爾伯特矩陣。其中hilb函數(shù)有兩種調(diào)用格式:
hilb(n):n為常數(shù),返回一個n階的希爾伯特矩陣。
hilb(n,classname):n為常數(shù),表示的是希爾伯特矩陣的階數(shù),classname表示矩陣的類,classname的矩陣的類,可以取值為‘double’和‘single’,其中默認值為‘double’。
例如初始化一個4階希爾伯特矩陣:
a=hilb(4)
運行結(jié)果如下所示:
a =
1.0000 0.5000 0.3333 0.2500
0.5000 0.3333 0.2500 0.2000
0.3333 0.2500 0.2000 0.1667
0.2500 0.2000 0.1667 0.1429
在例如初始化一個single類的5階矩陣。
a=hilb(5,'single')
運行結(jié)果如下所示:
a =
5×5 single 矩陣
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250
0.2000 0.1667 0.1429 0.1250 0.1111
MATLAB中有專門求希爾伯特矩陣的逆矩陣的函數(shù)invhilb函數(shù),當n小于15時,invhilb(n)生成希爾伯特矩陣的精確的逆矩陣,當n大于15時,invhilb(n)生成的是Hilbert矩陣的近似矩陣。
10、伴隨矩陣
MATLAB對于一個多項式的伴隨矩陣為:
方程p(x)的根稱為A的特征值。
MATLAB生成使用compan函數(shù)生成伴隨矩陣,例如求的伴隨矩陣,代碼如下:
運行結(jié)果如下所示:
a=compan([4,5,12,4,6])
運行結(jié)果如下所示:
a =
-1.2500 -3.0000 -1.0000 -1.5000
1.0000 0 0 0
0 1.0000 0 0
0 0 1.0000 0
11、級聯(lián)矩陣
MATLAB將用指定方向進行合并兩個或者多個矩陣,函數(shù)調(diào)用如下如下:
(1)cat(dim,A1,A2,A3,A4,...An):在指定維度合并矩陣,cat(1,A,B)等同于cat(1,A,B)等同于[A;B],而cat(2,A,B)等同于[A,B]。
例如將三個矩陣的縱向合并矩陣:
A=[1,2,3;4,3,5];
B=[1,2,1;5,4,1];
C=[0,1,6;7,3,1];
D=cat(1,A,B,C)
E=cat(2,A,B,C)
運行結(jié)果如下:
D =
1 2 3
4 3 5
1 2 1
5 4 1
0 1 6
7 3 1
E =
1 2 3 1 2 1 0 1 6
4 3 5 5 4 1 7 3 1
(2)horzcat(A1,A2,...An):橫向合并矩陣,horzcat(A,B)等同于[A,B]。
例如:
A=[1,3;4,6;3,1];
B=[3,2;1,4;5,1];
A=horzcat(A,B)
運行結(jié)果如下所示:
A =
1 3 3 2
4 6 1 4
3 1 5 1
(3)horzcat(A1,A2,...An):縱向合并矩陣,horzcat(A,B)等同于[A;B]。
例如:
A=[1,3,4;6,3,1];
B=[3,2,1;4,5,1];
A=vertcat(A,B)
運行結(jié)果如下所示:
A =
1 3 4
6 3 1
3 2 1
4 5 1
(4)repmat(A,m,n):復(fù)制矩陣A來構(gòu)造一個新的矩陣,其中縱向復(fù)制m個A,橫向復(fù)制有n個A。
例如:
A=[1,4;5,8]
A=repmat(A,2,3)
運行結(jié)果如下所示:
A =
1 4 1 4 1 4
5 8 5 8 5 8
1 4 1 4 1 4
5 8 5 8 5 8
12、累計矩陣
在MATLAB中,使用accumarray對于指定的向量進行累計,然后用計算的結(jié)果構(gòu)造一個新的矩陣。accumarray有如下幾種調(diào)用格式:
(1)accumarray(subs,val):subs是下標矩陣或者是向量,而val是數(shù)據(jù),val可以是一個標量或者是一個向量。
當subs是一個向量時:
val=1;
subs=[1;2;5;2;4];
a=accumarray(subs,val)
運行結(jié)果如下所示:
a =
1
2
0
1
1
由上圖中的運行顯示,返回的是一個計數(shù)向量,表示的subs向量中下標出現(xiàn)次數(shù)與val的積。如果將val的值改為2:
val=2;
subs=[1;2;5;2;4];
a=accumarray(subs,val)
運行結(jié)果如下所示:
a =
2
4
0
2
2
對比兩次運行結(jié)果可以看到,當val變化增加一倍時,返回的結(jié)果也同樣增加一倍。
當val是一個向量時:
val=10:10:50;
subs=[1;2;5;3;4];
a=accumarray(subs,val)
運行結(jié)果如下所示:
a =
10
20
40
50
30
當subs是一個二維矩陣的時候,subs矩陣中的每行是val中對應(yīng)元素的位置。
例如:
val = 10:10:50;
subs=[1,3;3,1;2,2;3,2;2,1];
a=accumarray(subs,val)
運行結(jié)果如下所示:
a =
0 0 10
50 30 0
20 40 0
當subs中如果兩行元素相同的時候,那么對應(yīng)的val就會累計起來。例如:
val = 10:10:50;
subs=[1,3;3,1;2,2;3,2;3,1];
a=accumarray(subs,val)
運行結(jié)果如下所示:
a =
0 0 10
0 30 0
70 40 0
(2)accumarray(subs,val,sz):subs和val同(1)相同,而sz表示的是輸出數(shù)組的大小。其中,ALL(MAX(subs)<=sz),例如:
val=10:10:50;
subs=[1;2;5;3;4];
sz=[6 1]
a=accumarray(subs,val,sz)
運行結(jié)果如下所示:
a =
10
20
40
50
30
0
由運行結(jié)果可以看出,返回的結(jié)果為6行1列的矩陣,其中大于原來行數(shù)的內(nèi)容會用0來補充。
(3)accumarray(subs,val,sz,fun):subs和val同(1)相同,sz表示的輸出數(shù)組的大小,其中,其中ALL(MAX(subs)<=sz),fun表示的是函數(shù),默認情況下為[],例如;文章來源:http://www.zghlxwxcb.cn/news/detail-800141.html
val = 1:5;
subs = [1,1;2,1;2,2;1,2;2,1];
a = accumarray(subs,val,[],@(x) {x})
運行結(jié)果如下所示:文章來源地址http://www.zghlxwxcb.cn/news/detail-800141.html
a =
2×2 cell 數(shù)組
{[ 1]} {[4]}
{2×1 double} {[3]
到了這里,關(guān)于利用MATLAB構(gòu)建特殊通用矩陣的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!