2021年6月6日 星期日

矩陣的分合與定址

 矩陣的分合與定址

源自於http://bime-matlab.blogspot.com/2006/09/25.html

矩陣疊加

利用幾個行向量或列向量相搭配,也可以湊出另一個新的矩陣。以A矩陣為例,可以自我疊加,或與其他同大小的矩陣疊加:


>>A=[1 2 3;4 5 6];

>>B=[A;A]
B =
1 2 3
4 5 6
1 2 3
4 5 6

>> C=[A' A']
C =
1 4 1 4
2 5 2 5
3 6 3 6

>> D=[A' A';B']
D =
1 4 1 4
2 5 2 5
3 6 3 6
1 4 1 4
2 5 2 5
3 6 3 6

結果,B為4x3大小之矩陣;C為3x4大小之矩陣。後者之A必須先行轉置,才能進行合併。

>> size(A)

ans =     2     3

>> size(B)

ans =     4     3

矩陣次標

要指出某矩陣中之元素,或取出運用必須有一套方法,通常就其位置在第幾列第幾行呼之,如:

>> A
A =
     1     2     3
     4     5     6
>> A(1)
ans =     1

>> A(2)
ans =     4

>> A(3)
ans =     2

>> A(1,3)
ans =     3
>> [A(1,3) A(2,2) A(1,2)]

ans =     3     5     2
所以利用這種直接呼叫的方式,也可以另組一個新的矩陣,但仍必須加中括號規範之。若所要取出的元素是鄰近的位置,則可用n1:n2之表示法,以上述之C矩陣為例:
A =
     1     2     3
     4     5     6
>> A(1,1:2) ans = 1 2 >> A(1,1:3) ans = 1 2 3
若要取得其中之全行,則僅使用冒號(:),前後不加數字即可
>> A
A =
     1     2     3
     4     5     6

>> C
C =
     2     3     4     6
     1     2     3     4
     4     3     2     1
>>D=[A(1,:)' C(:,2:3)]
D =
     1     3     4
     2     2     3
     3     3     2
如果所選取的行或列並不相鄰,則可以用中括號將所要的行或列直接列舉,
如將C矩陣中之第一、三、四行抽出成立E矩陣:
>> C
C =
     2     3     4     6
     1     2     3     4
     4     3     2     1

>> E=C(:,[1,3,4]) %C矩陣中之第一、三、四行抽出成立E矩陣
E = 2 4 6 1 3 4 4 2 1
空矩陣也是一個常用的矩陣,實際上其內並不含任何元素,它常以[ ]表示。如果矩陣中某一行或列被此空矩陣取代,
表示將該行或該列將被刪除。
E =
     2     4     6
     1     3     4
     4     2     1

>> E(2:3,:)=[]

E =     2     4     6
此時之E矩陣由於二及三列被取代為空矩陣,故只剩下孤單單的一個列矩陣了。
在矩陣之排序中,即使為二維矩陣,它仍有一定的排序順序。實際上其計數是
以行為順序進行計數,
>> AA=[1 2 3;4 5 6;7 8 9]
AA =
     1     2     3
     4     5     6
     7     8     9
 
>> AA(3,2)
ans =     8
>> AA(6)
ans =     8
一個矩陣亦可由不同的區塊矩陣組成,例如:上述之A為[3 x 3]矩陣,
加上其他可以組成另一個 [6x4] 之B矩陣:
>> A=[1 2 3;4 5 6;7 8 9]
A =
1 2 3 4 5 6 7 8 9

>> B = [A, zeros(3,1); 4*ones(3,3), [1;2;3]]
B =
1 2 3 0
4 5 6 0
7 8 9 0
4 4 4 1
4 4 4 2
4 4 4 3
再次請特別注意,矩陣中之”;”表示置於下一列,而”,”表示接續於下一行之意。

矩陣之重組


若要重排原來矩陣之型式,可以利用reshape函數,其第二及三個參數即為要改變之大小:

>> d=reshape(B,3,8)

d =
1 4 2 4 3 4 0 1
4 4 5 4 6 4 0 2
7 4 8 4 9 4 0 3

>> d=reshape(B,8,3)

d =
1 8 4
4 4 4
7 4 0
4 4 0
4 3 0
4 6 1
2 9 2
5 4 3

>> d=reshape(B,4,6)

d =
1 4 8 3 4 0
4 4 4 6 4 1
7 2 4 9 0 2
4 5 4 4 0 3

無論如何改變,注意其順序係先取行向,逐行取盡。若非此種取向,則B矩陣需先行轉置。

下面的例子為利用reshape之函數組成新矩陣AA之例子:

>> AA =reshape(1:9,3,3)

AA =
1 4 7
2 5 8
3 6 9
>> AA =reshape(1:16,4,4)
AA =
     1     5     9    13
     2     6    10    14
     3     7    11    15
     4     8    12    16

若將其中對角線之元素累加,則得:

>> AA(1,1)+AA(2,2)+AA(3,3)

ans = 15

若相取出某一項超出矩陣範圍的元素時,程式會發出錯誤的信息:

>> AA(2,4)??? Index exceeds matrix dimensions.

但是也將矩陣之特定元素更換其值,例如:

>> AA(1,1)=10

AA =
10 4 7
2 5 8
3 6 9

第一項之值即單獨改變。但若將某值給予超出矩陣的位置時,矩陣倒可以隨機應變,增加其大小,其餘未有給值的元素一律給零,例如:

>> AA(2,4)=10

AA =
10 4 7 0
2 5 8 10
3 6 9 0

這個特性有時可以多加利用,但如果在程式中,一再利用這種擴充方式,可能會增加電腦之計算時間。實際上應用時,應加以考慮。


沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...