1. 程式人生 > >Matlab的精髓:千錘百煉的矩陣

Matlab的精髓:千錘百煉的矩陣

1.常用矩陣的生成

自定義矩陣的生成:

# 空格/逗號表示列,分號/換行表示行
A = [1 2; 3 5; 8 5; 4 6]
# 從1到9,每隔2個取一個整數,即1,3,5,7,9  (2可以是整數/小數) 。2不寫,預設1
B = 1:2:9

利用一些內建函式生成特定的矩陣:

# 5*6全0矩陣
C = zeros (5,6)
# 生成5*6的全1矩陣
D = ones(5,6)
#生成4~12之間5個等分的數(小數/整數)。6不寫,預設100
E = linspace (4,12,6)   
# 生成5個[10^1 , 10^3]之間的數。5不寫,預設50
F = logspace(1,3,5) # 生成5行6列對角線是1,其他是0的矩陣 G = eye(5,6)

常用隨機矩陣的生成:

# 生成[0,1]範圍內的5*6的隨機小數矩陣
A = rand(5,6)
# 只產生一個[0,1]範圍內的隨機小數矩陣
B= rand
# 在[m,n]範圍內生成a行b列小數矩陣
C=m+(n-m)*rand(a, b)
# 生成[1,m]範圍內的a*a整數矩陣
D= randi(m,a)
# 生成一個[1,a]之間的整數
E = randi(a) 
# 生成[-5,5]範圍內的10*1的整數矩陣
F = randi([-5,5],10,1)

提示: 在Matlab中,矩陣是用一對方括號定義

2.矩陣索引

# 訪問A的m行n列
A(m,n)
# 訪問A的某個元素,按列
A(m)
# 訪問A的m~n的資料塊,按列
A(m:n)
# 在m~n的範圍內,每隔a個數訪問,按列
A(m:a:n)
# 直接訪問第a,b,c ..個數據
A([a,b,c..])
# a行所有資料 / a列所有資料
A(a,:) / A(:,a)
# 取第1行,第三行,第4列,第2列組合的矩陣,並且第4列為第一列
C = A([1,3],[4,2])
# 取1,4,7行(1~9,每隔3),列也是如此
C= A(1:3:9,2:3:9)
# 第a列和第b列的所有元素
A(:,[a,b])
# a~b行和c列d列元素
A(a:b,[c,d]) # A和B是大小相同的矩陣,如果B的當前位置元素為非0,則取A中當前位置的元素 A(find(B)) # d的值是A矩陣m行,n列對應的單下標索引 d = sub2ind(size(A),m,n) # A矩陣單下標d轉換成雙下標的m行,n列 [m,n] = ind2sub(size(A),d)

提示: 在Matlab中,索引下標都是從1開始的,不同於C/C++、java、python等語言中的陣列 。 而且矩陣的排序是按照列優先。

3.矩陣求大小

d = size(A) d=x y  #  x是A的行數,y是A的列數 。三維陣列也適合
[m,n] = size(A)     # m是A的行數,n是A的列數
d = length(A)   # 返回矩陣A維度最大的維度數
d = numel(A)    # 返回矩陣中元素的總個數,行數 * 列數

4.矩陣運算

算術運算:

# 矩陣轉置
A'
# A的逆矩陣
inv(A)
# 矩陣每個元素*10 ,同樣適應於 + - * /
A*10
# 矩陣運算,和線性代數中矩陣的運算是一樣的
A+B 
A-B
A*B 
A/B   # 相當於  A*inv(B)
A\B   # 相當於  inv(A)*B
# 兩個矩陣對應位置上的元素進行計算
A.*B
A./B(A除以B)
A.\B(B除以A)
# 對應位上元素進行計算
A.^B
A.^2
2.^A
# 矩陣的跡,等於矩陣對角線元素的和,矩陣的特徵值之和
trace(A)  

5.矩陣翻轉

# 矩陣 上下翻轉,預設中心軸為中間的那一行(共有偶數行的話直接翻轉,奇數行的話中間一行不動)
flipud(A)
# 矩陣 左右翻轉
fliplr(A)
# A按照逆時針旋轉90*k度,k預設為1
rot90(A,k)

6.矩陣的拼接

為方便演示,先定義如下矩陣:

A =

     1     2     3
     4     5     6
B =

     7     8     9
    10    11    12
    13    14    15
C =

    16    17
    18    19   

拼接演示:

# 1 . A和B根據標識組合起來,得到新矩陣C
#       (標識: 1-各個矩陣豎著疊在一起(列數必須一樣) 
                2-各個矩陣橫著連在一起(行數必須一樣) 
D = cat(1,A,B)
D =
     1     2     3
     4     5     6
     7     8     9
    10    11    12
    13    14    15
# 2.  兩個矩陣豎著疊在一起,相當於cat標識為1的情況 。(列數必須一樣)
D=vertcat(A,B)
D =
     1     2     3
     4     5     6
     7     8     9
    10    11    12
    13    14    15
# 3. 兩個矩陣橫著連在一起,相當於cat標識為2的情況 。(行數數必須一樣)
D = horzcat(A,C)
D =
     1     2     3    16    17
     4     5     6    18    19
# 4. 矩陣為一個塊,以塊為基本單位拼成3行個塊,2列個塊的新矩陣
D=repmat(C,3,2)
D =
    16    17    16    17
    18    19    18    19
    16    17    16    17
    18    19    18    19
    16    17    16    17
    18    19    18    19
# 5. 對角線拼接矩陣
D=blkdiag(A,B)
D =
     1     2     3     0     0     0
     4     5     6     0     0     0
     0     0     0     7     8     9
     0     0     0    10    11    12
     0     0     0    13    14    15
# 6. 詞窮,自己觀察吧,提示,一個大組裡面有6個小組
D=kron(A,C)
D =

    16    17    32    34    48    51
    18    19    36    38    54    57
    64    68    80    85    96   102
    72    76    90    95   108   114