語言基礎2 矩陣和數組
矩陣和數組是matlab中信息和數據的基本表示形式
可以創建常用的數組和網格 合并現有的數組 操作數組的形狀和內容 以及使用索引訪問數組元素
用到的函數列表如下





一 創建 串聯和擴展矩陣
矩陣時按行和列排列的數據元素的二維數據元素的二維矩形數組。
元素可以是數字、邏輯值、日期時間、字符串、categorical、或其他matlab數據類型
>> A=100; >> whos A Name Size Bytes Class Attributes A 1x1 8 double
構建數據矩陣
>> A=[12 62 93 -8] A = 12 62 93 -8 >> whos A Name Size Bytes Class Attributes A 1x4 32 double
>> A=[12 62;93 -8]
A =
12 62
93 -8
專用矩陣函數
zeros(n1,n2) n1行數 n2列數
ones(n1,n2)
>> zeros(2,3) ans = 0 0 0 0 0 0 >> ones(2,4) ans = 1 1 1 1 1 1 1 1
diag函數將輸入元素放在矩陣的對角線上
>> A = [12 62 93 -8]; B = diag(A) B = 12 0 0 0 0 62 0 0 0 0 93 0 0 0 0 -8
串聯矩陣
使用方括號來追加現有矩陣 此方法稱為串聯
>> A=ones(1,4); >> B=zeros(1,4); >> C=[A B] C = 1 1 1 1 0 0 0 0
串聯多個矩陣 必須具有兼容的大小,水平串聯矩陣時 行數必須相同,垂直串聯矩陣,列數必須相同。
串聯兼容矩陣的另一種方法時使用串聯函數
horzcat vertcat cat
使用horzcat將第二個矩陣水平追加到第一個矩陣
>> D=horzcat(A,B) D = 1 1 1 1 0 0 0 0
使用vertcat將兩個矩陣垂直連接
>> E=vertcat(A,B) E = 1 1 1 1 0 0 0 0
生成數值序列
colon 創建由連續且等間距元素組成的矩陣的便捷方式。例如創建一個行向量 其元素是從1到10的整數
>> A=1:10 默認增量為1 A = 1 2 3 4 5 6 7 8 9 10 >> A=-2.5:2.5 A = -2.5000 -1.5000 -0.5000 0.5000 1.5000 2.5000 >> A=0:2:10 指定增量為2 A = 0 2 4 6 8 10 >> A=6:-1:0 增量為負值 則遞減 A = 6 5 4 3 2 1 0 >> A=1:0.2:2.1 增量為非整形值 如果增量值不能平均分指定的范圍 則會在超出范圍之前在可以達到的最后一個值處自動結束序列 此處最后為2 A = 1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
擴展矩陣
通過想一個或多個元素置于現有行和列索引邊界之外,可以將他們添加到矩陣中 matlab會自動用0填充矩陣,使其保持為舉行
例如創建一個2x3矩陣 然后在(3,4)的位置插入一個元素 使矩陣增加一行一列
>> A=[10 20 30;60 70 80] %A 為2x3 A = 10 20 30 60 70 80 >> A(3,4)=1 此時(1,3)(2,3) 兩個位置為0 此時A為3x4 A = 10 20 30 0 60 70 80 0 0 0 0 1
還可以通過現有索引范圍之外插入新矩陣來擴展其大小
>> A(4:5,5:6)=[2 3;4 5] 執行完成后 A為5x6 矩陣 未賦值的索引位置填0 A = 10 20 30 0 0 0 60 70 80 0 0 0 0 0 0 1 0 0 0 0 0 0 2 3 0 0 0 0 4 5
上例中 A(4,5)=2 A(4,6)=3 A(5,5)=4 A(5,6)=5
如果重復擴展矩陣的大小 例如在for循環中,最好要為預計創建的最大矩陣預分配空間,matlab必須在每次大小增加時分配內存,所以時間開銷較大。
可以預先生成一個大的全0矩陣
zeros(10000,10000) 行和列都是10000的矩陣
A=zeros(10000,10000) 如再大 需要再矩陣所以范圍之外指定元素或將另一個預分配的矩陣與A串聯來進行擴展
空數組
指至少有一個維度的長度等于零的數組 空數組可用于以編程方式表示“無”的概念
案例:
>> A=[1 2 3 4]; >> ind=find(A<0) ind = 空的 1×0 double 行向量
許多算法都包含可以返回空數組的函數調用 允許將空數組作為函數參數傳遞 而不是作為特殊情況處理。
需要自定義空數組的處理方式 可以使用isempty 函數來檢查它們
TF=isempty(ind)
TF=logical
1 返回真值
數組索引
根據元素在數組中的位置(索引)訪問數組元素的方法主要有三種:按位置索引、線性索引和邏輯索引。
按元素的位置進行索引
指定向量中的單個元素 : A(3,2) 行列式的方式 先給行號 再給列號
指定向量中的多個元素:A()
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16] a1=A(3,2) %3行2列 索引對應的值 a2=A(2,[1 3]) %A(2,1) A(2,3) a3=A(1:3,2:4) % 訪問第一到第三行、第二到第四列中的元素 a4=A(1:3,2:end) %end為最后一列 a5=A(:,3)%:表示所有行或所有列 此處表示所有行的第3列 全部數據 輸出: A = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 a1 = 10 a2 = 5 7 a3 = 2 3 4 6 7 8 10 11 12 a4 = 2 3 4 6 7 8 10 11 12 a5 = 3 7 11 15
通過索引來訪問matlab中任何數組的元素 而不管其數據類型或維度如何 例如 直接訪問datetime數組的列
datetime數組
>> datetime(2018,1:5,1) %詳情參考 datetime()函數詳情 ans = 1×5 datetime 數組 2018-01-01 2018-02-01 2018-03-01 2018-04-01 2018-05-01 >> datetime(2018,1,1:5) ans = 1×5 datetime 數組 2018-01-01 2018-01-02 2018-01-03 2018-01-04 2018-01-05
使用單個索引進行索引
線性索引 實際上數據實際的存儲方式都是按內存列式存儲
>> A=[12 36 91;45 29 48;33 25 11] A = 12 36 91 45 29 48 33 25 11 >> Alinear=A(:) %顯示全部 Alinear = 12 45 33 36 29 25 91 48 11 >> A(6) 按列序 定值 ans = 25 >> A(3,2) 按二維數組坐標索引定值 ans = 25
>> s=sum(A(:))
s =
330
sub2ind 和 ind2sub 函數可用于在數組的原始索引和線性索引之間進行轉換 例如計算A的第3,2個元素的線性索引。
>> linearidx=sub2ind(size(A),3,2) % 將行,列的形式轉換為線性索引單列的形式 所以(3,2)對應單列為6 返回值為6 linearidx = 6 >> [row,col]=ind2sub(size(A),6) % 將單列的線性索引形式轉換為行,列定位的形式 返回2個輸出的變量 row = 3 col = 2
使用邏輯值進行索引
使用true和false 邏輯指示符也可以對數組進行索引 在處理條件語句時尤其便利。
例如 假設想知道A中的元素是否小于另一個矩陣B中的對應元素
當A中的元素小于B中的對應元素時,小于號運算符返回元素為1的邏輯數組。
>> A=[1 2 6;4 3 6] A = 1 2 6 4 3 6 >> B=[0 3 7;3 7 5] B = 0 3 7 3 7 5 >> ind=A<B %判斷A和B的各個對應元素 是否滿足小于關系 是為1 否為0 ind = 2×3 logical 數組 0 1 1 0 1 0
上例中得到了滿足條件的元素的位置;
已經可以使用ind作為索引數組來檢查各個值
matlab 將ind中值1的位置與A和B中的對應元素進行匹配,并在列向量中列出它們的值。
>> Avals=A(ind) 列出A中的值 Avals = 2 3 6 >> Bvals=B(ind) 列出B中的值 Bvals = 3 7 7
is函數還返回邏輯數組 指示輸入中的哪些元素滿足特定條件。
ismissing函數檢查string向量中的哪些元素時缺失值。
>> str=["A" "B" missing "D" "E" missing]; >> ind=ismissing(str) 返回一個索引數組 對應值為1的索引位置的字符缺失 原字符數組中包含missing的索引位置為1 其余為0 ind = 1×6 logical 數組 0 0 1 0 0 1
假設要查找非缺失值元素的值 將~運算符和索引向量ind結合使用即可實現此目的
>> strvals=str(~ind) % strvals = 1×4 string 數組 "A" "B" "D" "E"
查找符合條件的數組元素
通過對數組應用條件來過濾數組元素。
檢查矩陣中的偶數元素、查找多維數組中所有0值的位置,或者替換數據中的NaN值。
通過組合使用關系運算符和邏輯運算符來執行這些任務。
> < <= == ~= 邏輯運算符 and or not 分別用& | ~表示 從而應用多個條件。
應用單個條件
rng default 創建一個5x5矩陣 元素為位于1和15之間的隨機整數 A=randi(15,5) randi(imax,n) 返回5x5矩陣 其中包含從區間[1,imax]的均勻離散分布中得到的偽隨機整數
A =
13 2 3 3 10 14 5 15 7 1 2 9 15 14 13 14 15 8 12 15 10 15 13 15 11
>> B=A<9 使用小于號關系運算符 確定A中的哪些元素小于9 將結果存儲在B中 B = 5×5 logical 數組 0 1 1 1 0 0 1 0 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 B為邏輯矩陣 每個值都表示為邏輯值的狀態 符合的元素索引位置為1 否則為0 假
>> A(B) B中不會指出這些元素的具體值是多少 但是可以使用B創建A的索引 從而得出滿足條件的值 ans = 以列的形式展示出來 2 2 5 3 8 3 7 1
由于B為邏輯矩陣 所以上面的運算稱為邏輯索引
有時某些問題需要符合條件的數組元素的位置信息 而非其實際值。
案例可以使用find函數來查找A中小于9的所有元素
>> I=find(A<9) I = 3 6 7 11 14 16 17 22 返回的是一個由線型索引組成的列向量 每個索引描述A中一個小于9的元素的位置 因此實際上A(I)與A(B)返回的結果相同
差別為A(B) 使用邏輯索引 而A(I)使用線性索引
應用多個條件
使用and or not 運算符將任意多個條件應用于一個數組;條件的數量并不局限于一個或兩個。
首先,使用邏輯and運算符 由&表示 指定兩個條件:元素必須小于9且大于2 將這些條件指定為邏輯索引 以查看符合兩個條件的元素。
>> A(A<9 & A>2) ans = 5 3 8 3 7
結果為A中同時符合這兩個條件的元素的列表。
務必使用單獨的語句指定每個條件,并用邏輯運算符連接起來。
例如:
不能通過A(2<A<9)指定以上條件,因為其計算結果為A(2<A|A<9).
接下來,查找A中小于9且為偶數的元素。
>> A(A<9&~mod(A,2)) ans = 2 2 8 線型排序 列向 顯示A中小于9的所有偶數元素的列表 使用邏輯NOT運算符~將矩陣mod(A,2)轉換為邏輯矩陣
并在可被2整除的元素位置防止邏輯值1 true
案例2:
查找A中小于9 為偶數且不等于2的元素
>> A(A<9&~mod(A,2)&A~=2) 返回具體的值 ans = 8
>> find(A<9&~mod(A,2)&A~=2) 返回元素所在的位置 索引 線性索引 ans = 14 即A(14)=8
替換符合條件的值
同時更改多個現有數組元素的值會很有用。將邏輯索引與簡單的賦值語句一起使用,可替換數組中符合條件的值。
將A中所有大于10的所有值替換為數值10
>> A(A>10)=10 A = 10 2 3 3 10 10 5 10 7 1 2 9 10 10 10 10 10 8 10 10 10 10 10 10 10 >>
>> A(A~=10)=NaN %將A中不等于10的所有值替換為NaN值 A = 10 NaN NaN NaN 10 10 NaN 10 NaN NaN NaN NaN 10 10 10 10 10 NaN 10 10 10 10 10 10 10 >> A(isnan(A))=0; 將A中所有NaN值替換為0 并應用邏輯NOT運算符 ~A >> C=~A
C =
5×5 logical 數組
0 1 1 1 0
0 1 0 1 1
1 1 0 0 0
0 0 1 0 0
0 0 0 0 0
生成矩陣用邏輯值1 替代NaN值 用邏輯值0取代10 邏輯NOT運算~A將數值數組轉換為邏輯數組,因此A&C返回邏輯值0 的矩陣 A|C返回邏輯值1的矩陣。
浙公網安備 33010602011771號