1.創建矩陣
2.認識創建方法
基本運算符 []
冒号運算符 :
用逗号或空格分隔同一行的元素
用分号或回車鍵分隔不同的行
創建序列 linspace
3.說明
矩陣是一個二維的數據陣列
Matlab 是一個基于矩陣的計算環境,最基本的的數據結構是矩陣
單個數值也存儲為矩陣,在這種情況下,矩陣的大小為 1 乘 1
再例如'Hello World'這樣的字符元素是 1×11 的矩陣
也支持有兩個以上維度的數據結構,即 n 維數組
4.實例演示
%1_6
[1 2 3] %空格分隔元素
[1,2,3] %逗号分隔元素
[1 2 3
4 5 6] %回車創建不同行
[1 2 3;4 5 6] %分号分隔不同行
1:5 %行向量: 1 至 5
1:4.5 %取整到 4
4:1 %空的行向量(錯誤寫法)
4:-1:1 %4 至 1 行向量(正确寫法)
2.5:0.3:3.2 %按 0.3 增長至邊界值内
linspace(1,5,5) %參數分别為起點、終點和元素個數
linspace(1,5) %不指定元素個數,則默認 100 個元素
1.介紹一些創建矩陣的常用函數
2.認識函數
全 0 矩陣 zeros
全 1 矩陣 ones
單位矩陣 eye
對角矩陣 diag
魔方矩陣 magic
随機矩陣 rand
上三角矩陣 triu
下三角矩陣 tril
3.實例演示
%1_7
zeros(1,4) %1 行 4 列全 0 矩陣
zeros(3,4) %3 行 4 列全 0 矩陣
zeros(4) %4 階全 0 矩陣
ones(1,4) %1 行 4 列全 1 矩陣
eye(3) %3 階單位矩陣
eye(2,3) %2 行 3 列單位矩陣
magic(3) %3 階魔方矩陣
magic(30)
a=rand(1,4) %1 行 4 列随機矩陣
b=rand(4) %4 階随機矩陣
diag(b) %提取對角線元素
diag(a) %a 為向量,則将 a 元素擴展為 n 階矩陣
triu(b) %提取上三角形元素
tril(b) %提取下三角形元素
tril(b,1) %添加偏移量參數,1 正數往右上
tril(b,2)
tril(b,-1) %向左下偏移 1,再取下三角元素
1.矩陣的連接
2.認識連接方法
基本連接符[]
水平連接 horzcat
垂直連接 vertcat
平鋪複制 repmat
對角分塊 blkdiag
任意維度連接 cat
3.說明
矩陣連接是通過連接一個或多個矩陣來創建一個新矩陣的過程
與創建類似,逗号或空格實現水平連接,分号實現垂直連接
連接後的矩陣要仍然保持矩形結構才能實現連接
也就是說,水平連接矩陣,每個矩陣必須具有相同的行數
垂直連接時,每個矩陣必須具有相同的列數
4.實例演示
%1_8
a=[1 2;3 4]
b=[5 6;7 8]
[a,b] %矩陣水平連接
[a;b] %垂直連接
horzcat(a,b) %水平連接函數
vertcat(a,b) %垂直連接函數
repmat(a,1,3) %平鋪複制為 1 行 3 列矩陣
repmat(a,3,3)
blkdiag(a,b) %對角分塊重組函數:将矩陣 a 和 b 整體分别視為對角線上元素進行重組
e=[1 2]
cat(1,e,e) %任意維度連接:維度、矩陣 e、矩陣 e。1 維按列縱向連接
cat(2,e,e) %2 維:橫向連接
cat(3,e,e) %3 維:頁面方向(三維方向)
1.矩陣的索引
2.認識函數
獲取矩陣的行列數 size
3.概念
一個矩陣裡有多個元素,要想訪問或修改其中的元素,使用索引
索引 3 種方式:
①組合索引 A(i,j),也稱下标索引
②線性索引 A(i) ,按列優先的順序依次向下索引
③邏輯索引,在邏輯為真的位置返回矩陣的元素
4.說明
組合索引和線性方式可以互換
訪問多個元素或不連續的元素可以把索引寫成矩陣的形式
邏輯索引的維度必須與矩陣的維度相同
索引超出矩陣範圍的元素會報錯
5.實例演示
%1_9
a=magic(3) %3 階魔方矩陣
a(2,3) %組合索引:索引第 2 行第 3 列元素(2 個參數,用逗号分隔)
a(3) %線性索引:列優先索引(1 個參數)
size(a) %獲取矩陣行列維度
sub2ind([3,3],2,3) %組合索引轉化為線性索引,三個輸入參數為:矩陣維度、組合索引行位置、組合索引列位置
[row,col]=ind2sub(size(a),8) %線性索引轉化為組合索引
% a(3,4) %超出範圍報錯(初學者常犯錯誤)
a(1,:) %冒号:表示任意行或任意列
a(:,1) %任意行的第 1 列
a(:,:)
a(1,2:3) %第 1 行,第 2-3 列
a(1,[1 3]) %第 1 行,第 1 列和第 3 列
a(1,end) %end 表示最後一個:第 1 行最後 1 列
a([1 3]) %線性索引:矩陣 a 第 1 個和第 3 個元素
a([1 2;4 5]) %提取第 1、2 和第 4、5 個元素并分别放置在矩陣第 1 行和第 2 行
a(:) %按列優先轉變為單個數字序列,返回一列值
b=[1 2;3 4]
c=[true false;true false] %邏輯數組結果用 1/0 表示
b(c) %邏輯索引:邏輯值為真返回對應元素,為假不返回
1.矩陣元素的修改、添加和删除
2.說明
通過指定矩陣索引修改、添加或删除相應元素
索引超出矩陣範圍的元素會報錯,但可以賦值
删除元素後的矩陣仍然要保持矩形,否則報錯
必要時,對超出矩陣範圍的索引賦值需要預分配内存
3.實例演示
%1_10
a=[1 2 3;4 5 6;7 8 9]
a(2,2)=10
a(2)=10
a(3,4)=10 %超出矩陣範圍索引會報錯,但可以賦值。擴展為索引維度再對該索引元素賦值,其餘擴充位置填充元素 0
a(3:4,4:5)=[1 2;3 4] %通過組合索引賦值,先擴展維度再賦值
a(:,2)=[] %任意行第 2 列變為空:删除
% a(1,2)=[] %矩陣單個元素删除報錯,删除單個元素無法保持矩陣維度
a(2)=[] %線性索引先按列優先擴展為單個數字序列,删除單個元素可行
1.重塑矩陣包括矩陣的元素重排、旋轉、翻轉、移位、排序等
2.認識函數
元素重排 reshape
旋轉 rot90
左右翻轉 fliplr
上下翻轉 flipud
翻轉 flip
循環移位 circshift
排序 sort
按行排序 sortrows
判斷是否排序 issorted
3.實例演示
%1_11
%作者:freexyn
a=[1 2 3 4;5 6 7 8]
reshape(a,4,2) %元素重排,參數:矩陣名稱、重排行數、重排列數。重排規則:按列優先重排為所需維度
% reshape(a,3,3) %元素數量不符報錯
rot90(a) %矩陣旋轉:逆時針 90 度
fliplr(a) %矩陣左右翻轉
flipud(a) %矩陣上下翻轉
flip(a,1) %矩陣任意方向翻轉:參數 1 為方向,1 維方向是上下翻轉
flip(a,2) %2 維方向是左右翻轉
circshift(a,[0 2]) %矩陣循環移位:矩陣、移動步長(用向量表示行數、列數),移動方向為坐标軸正方向
circshift(a,[-1 2])
sort(a) %矩陣元素的列排序:默認升序排列(行不保持)
sort(a,'descend') %參數:降序排列
issorted(a) %判斷是否按升序已排列
issorted(a,'descend')
b=magic(3)
sortrows(b) %按行(保持)排序:将行視為整體,不指定參數則默認按每行第 1 元素大小升序排列
sortrows(b,2) %指定參數 2,即按每行第 2 個元素排序
sortrows(b,3)
1.矩陣的屬性
描述矩陣的信息,包括大小、長度、元素數目和維度等
2.認識函數
大小 size
長度 length
元素數目 numel
維度 ndims
3.實例演示
%1_12
a=[1 2 3 4;5 6 7 8]
size(a) %矩陣行數列數
length(a) %矩陣長度:取行數、列數中的最大值
length(a') %矩陣轉至後,長度仍為 4
numel(a) %返回元素個數
ndims(a) %矩陣維度數:2 即行和列(2 維度)
ndims(a(1,:)) %組合索引提取出第 1 行索引再計算維度,即行向量的維度,結果 2 因仍為行和列(2 維度)
ndims(a(1,1)) %提出 1 行 1 列元素計算維度,結果仍為 2,因單元素認為 1*1 矩陣(2 維度)
1.特殊的矩陣形式:空矩陣、标量和向量
2.認識函數
判斷空矩陣 isempty
判斷标量 isscalar
判斷向量 isvector
3.概念
3.1 空矩陣
有一個或多個等于零的維度(0×0,0×1,1×0)
3.2 标量
維度為 1×1 的矩陣,在 Matlab 中顯示為單個實數或複數
3.3 向量
維度為 1×n 或 n×1 的矩陣,在 Matlab 中顯示為一個行或一個列
4.實例演示
%1_13
%freexyn
a=[] %空矩陣
size(a) %獲取行列數
length(a) %矩陣長度
numel(a) %元素個數
ndims(a) %矩陣維度
isempty(a) %判斷是否空矩陣
zeros(0,1) %全 0 矩陣指定一個維度為 0
a=2 %創建标量
size(a)
length(a)
numel(a)
ndims(a)
isempty(a)
isscalar(a) %判斷是否為标量
a=[1 2 3] %創建向量
size(a)
length(a)
numel(a)
ndims(a)
isempty(a)
isscalar(a)
isvector(a) %判斷是否向量
1.多維數組的創建和索引方法
2.認識函數
維度簡化 squeeze
3.概念
Matlab 中具有多于兩個維度的數據陣列被稱為多維數組
多維數組是普通二維矩陣的擴展
如圖為 3*3*2 的三維數組(維度名稱分别為行、列、頁面)
3*3*2 的三維數組
4.實例演示
%1_14
a=[1 2 3;4 5 6;7 8 9]
b=[11 12 13;14 15 16;17 18 19]
c=a
c(:,:,2)=b %數組 c 任意行任意列的第 2 個頁面賦值數組 b。顯示時,對高維數組進行拆分,拆分為 2 維數組顯示
ndims(c) %數組維度
size(c) %行、列、頁面數
d=c %3 維數組賦值給 d
d(:,:,:,2)=c %d 的任意行、列、頁面的第 4 個維度的第 2 索引賦值一個 3 維數組 c。顯示時,高維數組依次拆分,遍曆循環顯示每個 2 維數組
ndims(d) %4 維
size(d) %每個維度大小:3 3 2 2
%% 用創建矩陣的函數創建高維數組
zeros(2,2,2) %3 維全 0 數組
repmat(10,[2 2 2]) %矩陣平鋪重塑:将标量 10 平鋪重塑為 2 行 2 列 2 頁面的數組
reshape(c,[2 3 3]) %對高維數組進行重塑:c 是 3*3*2 數組重塑為 2*3*3 數組
c(1,[1 2],2) %組合索引:訪問數組 c 中第 1 行、第 1 和 2 列中、第 2 個頁面的元素
d(:,:,1,1) %(4 維數組)組合索引:任意行、列、第 1 頁面、第四維度 1 的元素
c(1,1) %對于 3 維數組使用低維索引,索引第 1 行第 1 列,不指定頁面,也可索引。高維數組使用低維索引,會自動用 1 補齊末尾索引
a(1,1,1) %低維數組用高維索引。原理:Matlab 中任何數組都可理解為無限尾随 1 的高維數組
e=ones(2,2,1,1,1,1,1) %全 1 矩陣:2 行 2 列,後面尾随 1 無實際意義
e=ones(2,2,1,1,1,2,1) %全 1 矩陣:2 行 2 列,第 6 維為 2,會将 3、4、5、7 維度初始化為0
squeeze(e) %維度簡化:簡化高維數組中不必要的維度
1.在處理大型數組時,兼顧 Matlab 運算性能的優化
2.說明
使用大型數組時,盡量避免創建不必要的副本
處理數組容量不斷變化的問題時,合理的進行預分配内存
把代碼放入程序文件中,比在命令窗口中,運算效率高
3.實例演示
%1_15
a=magic(3)
a(3,3)=10
b=a %數據一樣,變量名稱不同,因此 a、b 變量同時指向了同一矩陣
a(3,3)=15 %執行該命令,先預分配内存并複制一份 a 的原始值,保留在上個語句 b 中,然後再改變 a 的元素值
%預分配内存:輸入變量時會初始化分配所需内存,而後續編程中變量變化需要更多内存時,需額外内存支持,可能面臨分布式的内存分布,調用效率受到影響,因此需預分配内存
a=zeros(300,300) %初始化 300*300 全 0 矩陣,Matlab 會分配相應内存,在該維度内對元素進行相應修改替換,确保在完整内存中高效運行
% a=zeros(30000,30000)
(第二章結束,後接第三章)
,