師從清風(fēng)
矩陣的重構(gòu)和重新排列
reshape函數(shù)
reshape函數(shù)可以改變矩陣的形狀,其常用語法為reshape(A,m,n)或者reshape(A,[m,n]),這可以將矩陣A的形狀更改為m行n列,前提是轉(zhuǎn)化前后的兩個矩陣的元素總數(shù)要相同。例如有一個矩陣A,它原來的大小是2行6列,我們需要將其形狀變成3行4列,那么,我們可以使用命令:reshape(A, 3, 4). ?(A和B中的元素個數(shù)是相同的)
從上面的運(yùn)行結(jié)果可以看出,reshape函數(shù)實際上是按矩陣的線性索引來重新組織矩陣元素的。也就是說,它先取矩陣A的第一列,然后是第二列,依此類推,再按新的維度重新組織這些元素。因此,轉(zhuǎn)換后的B矩陣中的元素和A矩陣中的元素是完全相同的,即A(:)和B(:)的結(jié)果完全相同。
若A是一個由12個元素組成的矩陣,命令reshape(A,3,[ ])、reshape(A,[ ],4)可以實reshape(A,3,4)一樣的效果。
如果你給出的轉(zhuǎn)換后的行數(shù)和列數(shù)的乘積不等于原始矩陣中元素的個數(shù),那么MATLAB就會報錯:
sort函數(shù)
sort函數(shù)用來對向量或者矩陣進(jìn)行排序。如果是矩陣的話,可以對矩陣的每一行或每一列分別進(jìn)行排序。
第一:對向量v排序
sort(v) 可以將向量v按照從小到大的順序進(jìn)行升序排列
sort(v,'descend')可以將向量v按照從大到小的順序進(jìn)行降序排列
注意,上面的用法我們只使用了sort函數(shù)的一個返回值,即排序后的向量;
事實上,sort函數(shù)可以有兩個返回值,基本用法為:[sort_v , ind] = sort(v)
這里,sort_v是排序后的向量,ind是排序后的向量中的每個元素在v向量中的索引。
在上面的例子中,我們讓sort函數(shù)返回了兩個變量;sort_v和ind。它們是兩個長度相等的向量,向量的方向和sort函數(shù)中輸入的v向量的方向一致,都是行向量。向量v中所有元素的最小值為8,而8在v中的索引是4,因此sort_v中第一個元素為8,ind的第一個元素為4; 向量v中第二小的值為10,而10是v中的第1個元素,因此sort_v中第二個元素為10,ind的第二個元素為1;依次類推,可以得到sort_v和ind向量的值。事實上,這里有一個恒等關(guān)系成立:v(ind)運(yùn)行的結(jié)果和sort_v的結(jié)果全一樣,大家可以自行驗證。
下面具體的應(yīng)用場景
假設(shè)清風(fēng)班上有10名同學(xué),序號分別是1號、2號一直到10號。已知這10名同學(xué)的成績構(gòu)成的向量為:[84 70 61 90 69 78 88 74 92 76],問:清風(fēng)班上哪三名同學(xué)的分?jǐn)?shù)最高,分?jǐn)?shù)分別是多少?
根據(jù)MATLAB返回的結(jié)果可以看出:9號、4號和7號這三名同學(xué)的分?jǐn)?shù)排名前三,分別是92、90和88分。
引申一個問題:我們能不能知道這10名同學(xué)在班上的排名?
?
對矩陣A排序
使用方法:sort(A,dim)
dim = 1時,沿著行方向(從上至下)對矩陣的每一列按照從小到大的順序分別進(jìn)行排序
dim = 2時,沿著列方向(從左至右)對矩陣的每一行按照從小到大的順序分別進(jìn)行排序
? ?注意:(1)當(dāng)dim=1時,sort(A,1)可以直接寫成sort(A);
(2)默認(rèn)是升序排列的,我們可以在最后面加一個輸入?yún)?shù)'descend',變成從大到小的降序排列;
(3)可以有兩個返回值,代表的含義和對向量排序類似,表示排序后的元素在原矩陣所在行或所在列中的索引。
sort(A,2) ?% dim = 2時,沿著列方向(從左至右)對矩陣的每一行按照從小到大的順序分別進(jìn)行排序
sort(A,'descend') ?% 更改為降序排列
[sort_A , ind] = sort(A)
但這時候的A(ind)就不等于sort_A啦
sortrows函數(shù)
sortrows函數(shù)可以基于矩陣的某一列對矩陣進(jìn)行排序。這個函數(shù)的用法較多,我們這里直接以一個具體的實例來講解它的用法。
假設(shè)清風(fēng)老師有6名學(xué)生,每一行代表一名學(xué)生。這六名同學(xué)的四門科目的成績對應(yīng)著四列,例如第一名同學(xué)的第一科成績?yōu)?5,第二科成績?yōu)?0,依次類推。
score = [95 ? ?80 ? ?85 ? ?79 ??
? ? ? ? ?95 ? ?67 ? ?78 ? ?90 ? ?
? ? ? ? ?95 ? ?67 ? ?78 ? ?75 ??
? ? ? ? ?95 ? ?67 ? ?64 ? ?73 ??
? ? ? ? ?86 ? ?85 ? ?82 ? ?84 ? ?
? ? ? ? ?86 ? ?87 ? ?84 ? ?88];
請解決下面的問題:
(1)請基于第一科的成績按升序?qū)@六名同學(xué)進(jìn)行排序。當(dāng)?shù)谝豢瞥煽兿嗤瑫r,基于第二科成績升序排列。如果第二科成績還相同,就基于第三科成績進(jìn)行排序,依次類推。
sort_score1 = sortrows(score)
(2)請基于第一科的成績按升序?qū)@六名同學(xué)進(jìn)行排序。當(dāng)?shù)谝豢瞥煽兿嗤瑫r,請保持其在矩陣中出現(xiàn)的先后順序。
sort_score2 = sortrows(score,1)
(3)請基于第二科的成績按升序?qū)@六名同學(xué)進(jìn)行排序。當(dāng)?shù)诙瞥煽兿嗤瑫r,請保持其在矩陣中出現(xiàn)的先后順序。
sort_score3 = sortrows(score,2)
(4)請基于第一科的成績按升序?qū)@六名同學(xué)進(jìn)行排序。當(dāng)?shù)谝豢瞥煽兿嗤瑫r,基于第三科成績升序排列。如果第一科和第三科都相同,就保持在矩陣中出現(xiàn)的先后順序。
sort_score4 = sortrows(score,[1,3])
事實上,sortrows(score)等價于sortrows(score, 1:size(score,2)),即sortrows(score, [1,2,3,4])
(5)請基于第一科的成績對這六名同學(xué)進(jìn)行降序排列。當(dāng)?shù)谝豢瞥煽兿嗤瑫r,基于第三科成績降序排列。如果第一科和第三科都相同,就保持在矩陣中出現(xiàn)的先后順序。
sort_score5 = sortrows(score,[1,3],'descend')
(6)請基于第一科的成績對這六名同學(xué)進(jìn)行降序排列。當(dāng)?shù)谝豢瞥煽兿嗤瑫r,基于第三科成績升序排列。如果第一科和第三科都相同,就保持在矩陣中出現(xiàn)的先后順序。
sort_score6 = sortrows(score,[1,3],{'descend','ascend'})
(7)請基于第一科的成績按升序?qū)@六名同學(xué)進(jìn)行排序。當(dāng)?shù)谝豢瞥煽兿嗤瑫r,請保持其在矩陣中出現(xiàn)的先后順序,并返回索引值。
score
[sort_score7 , ind7] = sortrows(score,1)
注意:score(ind7,:)得到的結(jié)果和sort_score7的結(jié)果完全一樣。
score(ind7,:)
通過上面的例子可以看出,sortrows函數(shù)和sort函數(shù)的最大區(qū)別在于:
sort函數(shù)會對矩陣的每一列分別進(jìn)行排序;
sortrows函數(shù)是基于某一列進(jìn)行排序的,排序后得到的新矩陣的同一行元素不會改變。
score
sort(score)
sortrows(score)
在實際的應(yīng)用場景中,sort函數(shù)一般只用于對向量進(jìn)行排序;如果是矩陣或者表格排序,我們一般使用sortrows函數(shù),例如Excel中對表格的排序就和sortrows函數(shù)類似。在以后的章節(jié)中,我們會專門講到MATLAB中的表格數(shù)據(jù),到時候還會用的這個函數(shù)。
(4)flip / fliplr / flipud函數(shù)
這三個函數(shù)用于對矩陣進(jìn)行翻轉(zhuǎn)
flip:翻轉(zhuǎn)元素的順序; fliplr:將數(shù)組從左向右翻轉(zhuǎn) ;flipud:將數(shù)組從上向下翻轉(zhuǎn)
后面兩個函數(shù)是flip函數(shù)的特例。
用法1: flip(A)
如果 A 為向量,flip(A) 將沿向量的長度方向翻轉(zhuǎn)元素順序。
如果 A 為矩陣,flip(A) 將反轉(zhuǎn)每列元素的順序。
A = [5 2 7 8 9]; ?% 行向量
flip(A)
等價于 ?A(end:-1:1)
A(end:-1:1)
B = [5;2;7;8;9]; ?% 列向量
flip(B)
C = [5 8 7;
? ? ?4 2 6;?
? ? ?3 5 8;
? ? ?6 4 1];
flip(C)
用法2: flip(A,dim)
flip(A,dim) 沿維度 dim 翻轉(zhuǎn) A 中元素的順序。
如果 A 為矩陣,flip(A,1) 將沿著行方向?qū)仃嘇上下翻轉(zhuǎn),
? ? ? ? ? ? ? ? ? ? ? ? ? flip(A,2) 將沿著列方向?qū)仃嘇左右翻轉(zhuǎn)。
C = [5 8 7;
? ? ?4 2 6;?
? ? ?3 5 8;
? ? ?6 4 1];
flip(C,1) ? % 等價于flip(C) 或者 ?flipud(C)
flipud(C)
?flip(C,2) ? % ?fliplr(C)
?fliplr(C)
A = 1:5
flip(A)
flip(A,1)
(5)rot90函數(shù) ?
C = [5 8 7; 4 2 6; 3 5 8; 6 4 1]
rot90(C) ?% 逆時針方向旋轉(zhuǎn)90度
rot90(C,2) ?% 逆時針方向旋轉(zhuǎn)90*2=180度
rot90(C,3) ?% 逆時針方向旋轉(zhuǎn)90*3=270度
rot90(C,-1) ?% 逆時針旋轉(zhuǎn)-90度;等價于順時針旋轉(zhuǎn)90度文章來源:http://www.zghlxwxcb.cn/news/detail-841283.html
若有侵權(quán),請聯(lián)系作者文章來源地址http://www.zghlxwxcb.cn/news/detail-841283.html
到了這里,關(guān)于MATLAB中的矩陣的重構(gòu)和重新排列的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!