矩陣與向量的交換

如果 k, m, n 都是正整數,而且 k = m*n 則一個 m 乘 n 的矩陣, 可以和一個 k 維的向量或序列交換資料結構 (data structure)。 也就是說,兩者之間的資料 (元素) 相同,但是結構不同。 例如 A 是一個 2 乘 3 矩陣:

A = [1 4 0; 2 3 5]
也就是
        [ 1  4  0 ]
        [ 2  3  5 ]
那麼
v = A(:)
就使得 v 成為一個 6 維向量,v 的元素由 A 的元素組成, 組成的順序是按照第一行、第二行、... 這樣排列下去。也就是
        1
        2
        4
        3
        0
        5
這種排列的行為,術語叫做「行導向」。如果想要以「列導向」來組成向量, 也就是按照第一列、第二列、... 這樣的順序來排列, 可以先轉置矩陣。例如
Atrans = A';
v = Atrans(:)
注意,如果 A 是複數矩陣,應該要說 A.' 來轉置它。 如果想要得到序列,而非向量,可以說
Atrans = A';
v = Atrans(:)'

反過來,如果 v 是一個六維向量或序列,例如

v = [ 1 4 0 2 3 5]
我們可以將它改成一個 3 乘 2 的矩陣。做法是
B = zeros(3, 2);
B(:) = v
得到 B 如下:
        1   2
        4   3
        0   5
明顯可見,這仍然是「行導向」(column oriented) 的轉換: v 的元素先填滿 B 的第一行,然後第二行。 如果想要以「列導向」來填滿 B,則需要先產生一個 2 乘 3 的矩陣, 以行導向的方式填滿矩陣,然後再轉置成 2 乘 3 的矩陣。如下:
B = zeros(2, 3);
B(:) = v;
B = B'

舉一個應用的例子。令 A 是任意一個矩陣。如果要找一個 A 中最小元素, 那是簡單的,只要說

min(min(A))
就行了。但是,要找 A 中次小元素,就沒那麼容易了。 辦法之一就是先將 A 的元素排成一個向量,然後將此向量從小到大排序, 取出排序後的第二個元素。例如
A = rand(3,3)
v = sort(A(:));
v(2)
請讀者自行實驗,因為我們採用亂數矩陣作實驗,所以每次實驗所看到的答案不盡相同。

再舉一個簡單的應用範例。 如果想要製造如下的序列:

1 3 5 7 9 2 4 6 8 10
辦法之一,是先製造一個如下的 2 乘 5 矩陣:
        [ 1  3  5  7  9 ]
        [ 2  4  6  8 10 ]
然後將它轉置
        [ 1  2 ]
        [ 3  4 ]
        [ 5  6 ]
        [ 7  8 ]
        [ 9 10 ]
然後將它轉換成向量。做法如下:
A = zeros(2,5); A(:) = 1:10; B = A'; v = B(:); v = v'
則 v 即為所求。

習題

  1. 令 A 是任意一個 9 乘 9 方陣。例如 A = rand(9,9)。 請問如何找到 A 中第三大元素?
  2. 如何造出以下序列?
    0 4 8 ... 96 1 5 9 ... 97 2 6 10 ... 98 3 7 11 ... 99

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: Oct 3, 2001
Last Revised: Oct 10, 2001
© Copyright 2001 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw