【Matlab基础】02. 矩阵与元胞数组
Matlab的基本数据元素就是矩阵,可以是2维、1维(向量)、3维或更多维。
一、矩阵创建与表示
Matlab不用提前声明或定义变量,直接“起变量名、赋值、使用”。
注 :Matlab的变量名必须字母开头,由字母、下划线、数字构成,对字母大小写敏感;起变量名时应避开Matlab里的关键词。
1. 特殊向量
k=1:1:10 %创建行向量k, 起始值1, 步长1,终止值10
%默认步长是1, 同k=1:10
%Matlab语句结束用分号, 否则将自动输出该语句的执行结果
运行结果 :k = 1 2 3 4 5 6 7 8 9 10
2.一般矩阵 (字符串为元素的矩阵建议用元胞数组)
A=[1 2,3;4 5,6] %创建2行3列矩阵A, 矩阵大小不用预先定义
%矩阵元素必须放在“[ ]”内
%同行元素间用“, 或空格”隔开
%行与行间用“;”隔开
%矩阵元素可以是数值、变量、字符、函数表达式
运行结果 :A = 1 2 3
4 5 6
3.特殊矩阵
ones(m,n)——生成m×n维的全“1”矩阵
zeros(m,n)——生成m×n维的全“0”矩阵
eye(m,n)——生成m×n维的单位矩阵(多余的行或列全为0)
diag(k或A) ——生成或提取对角矩阵
triu(A)——提取矩阵A的上三角部分生成上三角矩阵
tril(A)——提取矩阵A的下三角部分生成下三角矩阵
rand(m,n)——生成m×n维的(0,1)区间均匀分布的随机矩阵
randn(m,n)——生成m×n维均值为0,方差为1的标准正态分布随机矩阵
fiplr(A)——矩阵A左右翻转
fipud(A)——矩阵A上下翻转
fipdim(A,dim)——矩阵A特定维度dim(1,2)翻转
sparse()——生成稀疏矩阵
full()——将稀疏矩阵化为普通矩阵
4.矩阵的维度、大小、长度
a=ndims(A) %返回矩阵A的维度(几维矩阵)
[I,J]=size(A) %返回矩阵A各维度维数的大小(几行,几列)
L=length(A) %返回矩阵A各维度维数的最大值(行数,列数的最大值),常用来测量向量的大小
运行结果:a = 2 I = 2 J = 3
L = 3
5. 矩阵拼接、扩充、变形
C = [A, B]——水平拼接
D = [A; B]——垂直拼接
repmat(A,[m,n])——重复生成m×n个的A
reshape(X, 3, 8)——把X变形为3×8的二维矩阵
二、矩阵元素的寻址和访问
1. 访问2维矩阵元素有两种方式 :
(1) 行列下标索引
A(i,j)——第i行,第j列的元素
(2)线性索引,也是矩阵存放元素的顺序,reshape()变形保持该顺序
A(1),A(2), …, A(m*n)——元素依次取自第1列,再第2列,……
故A(i,j) = A( (j-1)*m+i)
两种索引间的转换函数:
[I,J] = ind2sub( size(A), IND)
[IND]= sub2ind(size(A), I, J)
find()函数常用来查找矩阵中满足一定条件的元素
A=[1 2 3;4 5 6]
ind=find(A>4) %返回A中大于4的元素的线性索引值
[m,n]=find(A>4) %返回A中大于4的元素的行列下标索引值
[I,J]=ind2sub(size(A),ind); %线性索引转行列下标索引
IND=sub2ind(size(A),I,J); %行列下标索引转线性索引
运行结果
:
A = 1 2 3
4 5 6
IND = 4 6
m = 2
2
n = 2
3
2. 用冒号“:”获取矩阵的一些元素
A(i,:)——矩阵A的第i行,所有列
A(:,j)——矩阵A的第j列,所有行
A(:,i:j)——矩阵A的第i到第j列,所有行
A(i:j,k:end)——矩阵A的第i到第j行,第k到最后一列
A(:,[1,3])——矩阵A的第1、第3列,所有行
A(:)——按线性索引返回矩阵A的所有元素(向量)
3. 利用空矩阵删除矩阵元素
A(i,:) = []——删除矩阵A的第i行
A(:, j) = []——删除矩阵A的第j列
A(i:j,:) = []——删除矩阵A的第i到第j行
A(:,i:j) = []——删除矩阵A的第i到第j列
A(sub2ind(size(A),i, j)) = []——删除矩阵A的第i行第j列的元素
三、矩阵运算与矩阵函数
1. 矩阵运算
(1) 通常的矩阵间运算
加、减、乘、幂: + - * ^
左除 \ : AX=B \rightarrow X = A^{-1}B \rightarrow X = A \backslash B
右除 / : YA=C \rightarrow Y = C A^{-1} \rightarrow Y = C / A
(2) 点运算——同型矩阵各个对应位置的元素做该运算
点乘、点左除、点右除、点幂: .* .\ ./ .^
.+ .- 同+ -
(3) 矩阵运算
A’——转置
inv(A)——方阵的逆
pinv(A)——非方阵的广义逆,即ABA=A, BAB=B
norm(A)= norm(A,2); norm(A,1); norm(A,inf)——矩阵或向量的范数
det(A)——方阵的行列式
rank(A)——矩阵的秩
trace(A)——矩阵的迹
null(A)——基础解系(矩阵的零空间)
orth(A)——标准正交化
rref(A)——化行最简型(初等行变换解线性方程组)
subspace(A,B)——两个子空间的夹角(两个向量的夹角
[v,d]=eig(A)——方阵的特征值(对角阵d)与特征向量(v的列向量)
2. 矩阵函数
min(A)——按列求矩阵A最小值,min(x,[],2)按行求最小值
max(A)——按列求矩阵A的最大值,max(x,[],2)按行求最大值
mean(A)=mean(A,1)——按列求矩阵A的平均值(A非行向量)
sort(A)——矩阵各列按递增顺序排序
sort(A,'descend')——矩阵各列按递减顺序排序
sum(A)——矩阵A各列元素求和
prod(A)——矩阵A各列元素求积
dot(A,B)——A,B(同型)各列做内积(点积)
cross(A,B)——A,B(至少某个维度是3维)的外积(叉积)
cumsum(A)——每列元素的累计和(第i行是A前i-1行元素的和)
cumprod(A)——每列元素的累计积
四、三维矩阵
可以想象成一本书的“行、列、页”。
处理k个m×n的二维矩阵,可用一个m×n×k的三维矩阵A:
A(:,:, 1) 表示第1个m×n矩阵(第1页)
A(:,:, 2) 表示第2个m×n矩阵(第2页)
………………
A(:,:, k) 表示第k个m×n矩阵(第k页)
每个A(:, :, k)与2维矩阵操作一样。
五、元胞数组
矩阵只适合存放和处理若干相同类型的数据,要想同时存放和处理多种类型的数据就需要用元胞数组。
1. 元胞数组的创建
用“{ }”来创建,以区别创建矩阵的“[ ]”。
(1) 赋值语句创建
a = {'hello' [1 2 3; 4 5 6]; 1 {'1' '2'}}
%创建2×2的元胞数组,
%同行元素间用“, 或空格”隔开
%行与行间用“;”隔开
%第1行第1列的元胞,存放字符串'hello';
%第1行第2列的元胞,存放一个2×3矩阵
%第2行第1列的元胞,存放数 1
%第2行第2列的元胞,存放1×2元胞数组