一、矩阵操作
1.矩阵的生成
(1).在命令窗口中直接列出:
>> a=1,b=2,c=3;
a =
1
b =
2
>> M={a,b,c;a+b,b+c,c+a;a*b,b*c,c*a}
M =
[1] [2] [3]
[3] [5] [4]
[2] [6] [3]
(2).利用函数直接生成特殊性质的矩阵
图1.常用矩阵函数表 | |||
函数名称 | 函数功能 | 函数名称 | 函数功能 |
zero(m,n) | m行n列的零矩阵 | eig(A) | 求矩阵A的特征值 |
eye(n) | n阶方矩阵 | poly(A) | 求矩阵A的特征多项式 |
ones(m,n) | m行n列的元素为1的矩阵 | trace(A) | 求矩阵A的迹 |
rand(m,n) | m行n列的0~1之间随机矩阵 | cond(A) | 求矩阵A的条件数 |
randn(m,n) | m行n列的正态随机矩阵 | rref(A) | 求矩阵A的行最简形 |
magic(n) | n阶魔方矩阵 | inv(A) | 求矩阵A的逆矩阵 |
hess(A) | hess 矩阵 | det(A) | 求矩阵A的行列式 |
sqrtm(A) | 求矩阵A的平方根 | expm(A) | 求矩阵A的指数值 |
funm(A) | 按矩阵计算的函数值 | logm(A) | 求矩阵A的对数值 |
rank(A) | 求矩阵A的秩 | morm(A,1) | 求矩阵A的范数 |
图二
函 数 名 |
函 数 功 能 |
|
abs( ) |
绝对值、负数的模、字符串的ASCII码值 |
都可用来求字符串矩阵所对应的ASCII码数值矩阵 |
double( ) |
|
|
char( ) |
可以把ASCII码数值矩阵转换为字符串矩阵 |
|
fix( ) |
向零方向取整 |
|
floor( ) |
不大于自变量的最大整数 |
|
ceil( ) |
不小于自变量的最小整数 |
|
round( ) |
四舍五入到最邻近的整数 |
|
rem(x,y) |
求余函数 |
|
mod(x,y) |
% |
|
exp( ) |
指数函数 |
|
[ ] |
空操作符 |
|
format 格式符 |
设置或改变数据输出格式 (其中格式符决定数据的输出格式) |
|
e1:e2:e3 |
冒号表达式可以产生一个行向量 (其中e1为初始值,e2为步长,e3为终止值) |
|
linspace(a,b,n) |
产生一个行向量 (其中a和b是生成向量的第一个和最后一个元素,n是元素总数) [注:linspace(a,b,n)与a:(b-a)/(n-1):b等价] |
|
A(:,j) |
表示取A矩阵的第j列全部元素 |
|
A(i,:) |
表示A矩阵第i行的全部元素 |
|
A(i,j) |
表示取A矩阵第i行、第j列的元素 |
|
A(i:i+m,:) |
表示取A矩阵第i~i+m行的全部元素 |
|
A(:,k:k+m) |
表示取A矩阵第k~k+m列的全部元素 |
|
A(i:i+m,k:k+m) |
表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素 |
|
zeros |
产生全0矩阵(零矩阵) |
|
ones |
产生全1矩阵(幺矩阵) |
|
eye |
产生单位矩阵 |
|
rand |
产生0~1间均匀分布的随机矩阵 |
|
randn |
产生均值为0,方差为1的标准正态分布随机矩阵 |
|
zeros(size(A)) |
建立一个与矩阵A同样大小的零矩阵 |
|
reshape(A,m,n) |
在矩阵总元素保持不变的前提下,将矩阵A重新排成m×n的二维矩阵 |
|
magic(n) |
生成一个n阶魔方矩阵(其每行、每列及两条对角线上的元素和都相等) |
|
vander(V) |
生成以向量V为基础向量的范得蒙矩阵(最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积) |
|
hilb(n) |
生成希尔伯特矩阵 |
|
invhilb(n) |
求n阶的希尔伯特矩阵的逆矩阵 (用一般方法求逆会因原始数据的微小扰动而产生不可靠的计算结果) |
|
toeplitz(x,y) |
生成一个以x为第1列,y为第1行的托普利兹矩阵(除第1行第1列外,其他每个元素都与左上角的元素相同)[注:这里x, y均为向量,两者不必等长。toeplitz(x)用向量x生成一个对称的托普利兹矩阵] |
|
compan(p) |
生成伴随矩阵 (其中p是一个多项式的系数向量,高次幂系数排在前,低次幂排在后) |
|
pascal(n) |
生成一个n阶帕斯卡矩阵(由杨辉三角形表组成的矩阵) |
|
A\B |
A矩阵左除B矩阵(等效于A的逆左乘B矩阵,即inv(A)*B ) |
|
A/B |
A矩阵右除B矩阵(等效于B的逆右乘A矩阵,即A*inv(B) ) |
|
A^x |
矩阵的乘方运算(A为方阵,x为标量) |
|
find() |
找位置 |
|
diag(A) |
用于提取矩阵A主对角线元素,产生一个具有min(m,n)个元素的列向量(其中A为m×n矩阵) |
|
diag(A,k) |
提取矩阵A的第k条对角线的元素 |
|
triu(A) |
求矩阵A的上三角阵 |
|
triu(A,k) |
求矩阵A的第k条对角线以上的元素 |
|
tril(A) |
求矩阵A的下三角阵 |
|
tril(A,k) |
求矩阵A的第k条对角线以下的元素 |
|
rot90(A,k) |
将矩阵A旋转90o的k倍 |
|
fliplr(A) |
对矩阵A实施左右翻转 |
|
flipud(A) |
对矩阵A实施上下翻转 |
|
inv(A) |
求A矩阵的逆矩阵 |
|
pinv(A) |
求A矩阵的伪逆(也称为广义逆矩阵) |
|
det(A) |
求方阵A所对应的行列式的值 (把一个方阵看作一个行列式,并对其按行列式规则求得的值) |
|
rank(A) |
求矩阵A的秩(矩阵线性无关的行数与列数称为矩阵的秩) |
|
trace(A) |
求矩阵A的迹 (矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和) |
|
norm(V)或norm(V,2) |
计算向量V的2—范数 |
|
norm(V,1) |
计算向量V的1—范数 |
|
norm(V,inf) |
计算向量V的∞—范数 |
|
cond(A,1) |
计算A的1—范数下的条件数 |
|
cond(A)或cond(A,2) |
计算A的2—范数数下的条件数 |
|
cond(A,inf) |
计算A的 ∞—范数下的条件数 |
|
E=eig(A) |
求A的全部特征值,构成向量E |
|
[V,D]=eig(A) |
求A的全部特征值,构成对角阵D;并求A的特征向量构成V的列向量。 |
|
[V,D]=eig(A,‘nobalance’) |
直接求矩阵A的特征值和特征向量。 |
|
sqrtm(A) |
计算矩阵A的平方根 |
|
logm(A) |
计算矩阵A的自然对数 |
|
expm(A)、expm1(A) |
求矩阵指数eA |
|
expm2(A)、expm3(A) |
求矩阵指数eA |
|
funm(A,‘fun’) |
计算直接作用于矩阵A的由‘fun’指定的超越函数值 |
|
funm(A,‘sqrt’) |
计算矩阵A的平方根,等价于sqrtm(A) |
|
eval(t) |
把字符串的内容作为对应的MATLAB语句来执行(其中t为字符串) |
|
rmfield(A,‘ i’) |
要删除结构A的成员i |
|
celldisp(a) |
用来显示整个单元矩阵a |
|
A=sparse(S) |
将矩阵S转化为稀疏存储方式的矩阵A |
|
sparse(m,n) |
生成一个m×n的所有元素都是0的稀疏矩阵 |
|
sparse(u,v,S)-- |
建立一个max(u)行、max(v)列并以S为稀疏元素的稀疏矩阵 (其中u,v,S是3个等长的向量。S是要建立的稀疏矩阵的非0元素,u(i)、v(i)分别是S(i)的行和列下标) |
|
B=spconvert(A) |
根据表示稀疏矩阵的矩阵A,产生一个稀疏存储方式矩阵B |
|
A=spdiags(B,d,m,n) |
产生带状稀疏矩阵的稀疏存储(参数m,n为原带状矩阵的行数与列数) |
|
speye(m,n) |
返回一个m×n的稀疏存储单位矩阵 |
主要函数有如下:
1)空矩阵
2)零矩阵与全一矩阵
3)单位矩阵
4)对角矩阵:
>> v=[1 2 3 4 5];
>> Da=diag(v,0)
Da =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
>> Db=diag(v)
Db =
1 0 0 0 0
0 2 0 0 0
0 0 3 0 0
0 0 0 4 0
0 0 0 0 5
>> Dc=diag(v,-1)
Dc =
0 0 0 0 0 0
1 0 0 0 0 0
0 2 0 0 0 0
0 0 3 0 0 0
0 0 0 4 0 0
0 0 0 0 5 0
>> Dd=diag(v,1)
Dd =
0 1 0 0 0 0
0 0 2 0 0 0
0 0 0 3 0 0
0 0 0 0 4 0
0 0 0 0 0 5
0 0 0 0 0 0
5)三角矩阵:
T=tril(M) %表示抽取矩阵M中主对角线的下三角部分构成矩阵
T=tril(M,k) %表示抽取矩阵M中第k条对角线的下三角部分
T=triu(M) %表示抽取矩阵M中主对角线的上三角部分构成矩阵。
T=triu(M,k) %表示抽取矩阵M中第k条对角线的上三角部分。
6)魔方矩阵:
通常定义一个n阶魔方矩阵由自然数1~n*n排列而成且满足每行每列及两条主对角线上元素的n个数的和都为n(n*n+1)/2.
>> M1=magic(1),M2=magic(2),M3=magic(3)
M1 =
1
M2 =
1 3
4 2
M3 =
8 1 6
3 5 7
4 9 2
7)帕斯卡矩阵:
杨辉三角形表所组成的方阵。是由在二次项(x+y)的n次方的展开式中依升幂取得的系数组成的数表
>> P=pascal(6)
P =
1 1 1 1 1 1
1 2 3 4 5 6
1 3 6 10 15 21
1 4 10 20 35 56
1 5 15 35 70 126
1 6 21 56 126 252
8)随机矩阵:
rand(n) %生成一个n阶随机矩阵
rand(m,n) %生成一个m*n随机矩阵
rand(size(M)) %生成一个与矩阵M维度相同的随机矩阵
randn(n) %生成一个n*n正态分布随机矩阵
randn(m,n) %生成一个m*n正态分布随机矩阵
randn(size(M)) %生成一个与矩阵M维度相同的正态分布随机矩阵
9)稀疏矩阵:
S=sparse(F) %将完全矩阵转化为稀疏矩阵的排布
S=sparse(m,n) %生成m*n阶全零稀疏矩阵
S=sparse(i,j,s) %生成由i,j,s矢量定义的稀疏矩阵
S=sparse(i,j,s,m,n) %生成(i,j)对应元素为s的m*n阶稀疏矩阵
S=sparse(i,j,s,m,n,num)%同上的基础上必须含有num(大于i和j的长度)个非零元素
F=full(s) %将稀疏矩阵转化为完全矩阵
>> M=[0 0 0 0 2;0 0 0 1 0;0 0 0 4 0;3 0 0 0 0] %创建一个完全形式矩阵
M =
0 0 0 0 2
0 0 0 1 0
0 0 0 4 0
3 0 0 0 0
>> S=sparse(M) %将完全形式转化为稀疏矩阵的排布
S =
(4,1) 3
(2,4) 1
(3,4) 4
(1,5) 2
>> i=[1 2 3],j=[4 5 6],s=[7 8 9] %创建3个同维行矢量
i =
1 2 3
j =
4 5 6
s =
7 8 9
>> s1=sparse(2,3) %生成2*3全零稀疏矩阵
s1 =
All zero sparse: 2-by-3
>> F=full(s1)
F =
0 0 0
0 0 0
>> s2=sparse(i,j,s) %表示稀疏矩阵中非零元素的位置为(in,jn),值为sn,i,j为上面定义过的
s2 =
(1,4) 7
(2,5) 8
(3,6) 9
>> F=full(s2) %根据稀疏矩阵的排布还原其完全形式,查看s2的维度
F =
0 0 0 7 0 0
0 0 0 0 8 0
0 0 0 0 0 9
>> s3=sparse(i,j,s,5,6) %5和6表示s3的设定维度,需满足5>=MAX(in),6>=MAX(jn)
s3 =
(1,4) 7
(2,5) 8
(3,6) 9
>> F=full(s3) %根据稀疏矩阵的排布还原其完全形式,查看s3的维度
F =
0 0 0 7 0 0
0 0 0 0 8 0
0 0 0 0 0 9
0 0 0 0 0 0
0 0 0 0 0 0
>> s4=sparse(i,j,s,5,6,3) %同s3的基础上必须含有3个非零元素
s4 =
(1,4) 7
(2,5) 8
(3,6) 9
10)伴随矩阵:
A=company(M) %生成M的伴随矩阵
>> v=[1 6 11 6]; %矢量v为(s+1)(s+2)(s+3)=s^3+6s^2+11s+6多项式的系数矩阵
>> A=compan(v) %生成相应的伴随矩阵
A =
-6 -11 -6
1 0 0
0 1 0
>> eig(A) %该伴随矩阵的特征值即为多项式值为0所得的根
ans =
-3.0000
-2.0000
-1.0000
(3).通过MATLAB中的M文件产生
建立脚本存储数据,在命令行窗口输入文件名
(4)通过调用外部文件产生
>> load E:\aaa.txt
>> aaa
aaa =
317982 27
368929 97
528543 84
382636 20
2.矩阵的基本操作
(1).元素操作
1)元素扩充
M=[A0;A1 A2] %矩阵A0经加入A1,A2(行)的扩充后存入矩阵M
2)元素删除
M(:,n)=[] %表示删除矩阵M的第n列元素
M(m,:)=[] %表示删除矩阵M的第m行元素
3)元素修改
M(m,n)=a %表示将第m行第n列元素改为a
M(m,:)=[a b ...] %表示将M矩阵中第m行元素替换为[a b ...]
M(:,m)=[a b ...] %表示将M矩阵中第n列元素替换为[a b ...]的转置,即为[a b ...]'。
(2).数据变换
1)元素取整
floor(M) %所有元素向下取整
ceil(M) %所有元素向上取整
round(M) %所有元素四舍五入取整
fix(M) %所有元素按相对零就近取整的原则取整
2)有理数形式变换
[n,d]=rat(M) %将矩阵M表示为两个整数矩阵的点除,即M=n./d
3)元素取余数
R=rem(M,x) %表示各元素对模x取余
>> M=[1 2 3;2 3 4;3 4 5],R1=rem(M,0),R2=rem(M,2),R3=rem(M,5)
M =
1 2 3
2 3 4
3 4 5
R1 =
NaN NaN NaN
NaN NaN NaN
NaN NaN NaN
R2 =
1 0 1
0 1 0
1 0 1
R3 =
1 2 3
2 3 4
3 4 0
(3).结构变换
1)翻转:
fliplr(M) %左右翻转
flipud(M) %上下翻转
flipdim(M,dim) %按指定的维数翻转,特别地,dim=1时为上下翻转,dim=2时为左右翻转
rot %逆时针旋转90度,
rot(M,k) %逆时针旋转k*90度,其中k=+-1,+-2,...
rot的实验:
R2 =
1 0 1
0 1 0
1 0 1
>> rot R2
未定义与 'char' 类型的输入参数相对应的函数 'rot'。
>> rot(R2)
未定义与 'double' 类型的输入参数相对应的函数 'rot'。
>> rot(R2,1)
未定义与 'double' 类型的输入参数相对应的函数 'rot'。
>> y=rot(R2)
未定义与 'double' 类型的输入参数相对应的函数 'rot'。
>> Y=rot90(R2)
Y =
1 0 1
0 1 0
1 0 1
>> rot90(R2)
ans =
1 0 1
0 1 0
1 0 1
2)平铺
%矩阵由m*n块矩阵M平铺而成
repmat(M,m,n)
repmat(M,[m,n])
%矩阵由m*n*p*...块矩阵M平铺而成
repmat(M,m,n,p...)
repmat(M,[m,n,p...])
3)变维
%表示将B的元素依次填入A的对应位置中,A与B的元素个数必须相同
A(:)=B(:)
%reshape函数法,使矩阵M的元素维数=m*n
reshape(M,m,n)
reshape(M,[m,n])
%使矩阵M的元素维数=m*n*p...
reshape(M,m,n,p,...)
reshape(M,[m,n,p,...])
>> A=magic(3),B=pascal(3),C=[1 2 3 4 5 6 7 8 9] %创建待变换矩阵
A =
8 1 6
3 5 7
4 9 2
B =
1 1 1
1 2 3
1 3 6
C =
1 2 3 4 5 6 7 8 9
>> fliplr(A),D=flipud(A) %左右翻转,上下翻转
ans =
6 1 8
7 5 3
2 9 4
D =
4 9 2
3 5 7
8 1 6
>> repmat(B,2,3) %将B以2*3的格式平铺
ans =
1 1 1 1 1 1 1 1 1
1 2 3 1 2 3 1 2 3
1 3 6 1 3 6 1 3 6
1 1 1 1 1 1 1 1 1
1 2 3 1 2 3 1 2 3
1 3 6 1 3 6 1 3 6
>> E=repmat(B,2,1) %构成矩阵E,由B按2*1格式平铺
E =
1 1 1
1 2 3
1 3 6
1 1 1
1 2 3
1 3 6
>> B(:)=C(:) %将C中数据按B格式排布,注意排布的行列顺序
B =
1 4 7
2 5 8
3 6 9 %{}中没有“;”的话一列一列的排,有的话分行排
>> reshape(A,1,9) %将A按1*9排列
ans =
8 3 4 1 5 9 6 7 2
(4).矩阵的引用
矩阵引用的一般数据:
用matrixname函数但是在进行实验时并不能使用:
>> A=[1 2 3 4 5 6 7 8 9]
A =
1 2 3 4 5 6 7 8 9
>> reshape(A,3,3)
ans =
1 4 7
2 5 8
3 6 9
>> Matrixname(4)
未定义与 'double' 类型的输入参数相对应的函数 'Matrixname'。
>> matrixname(i,:)
未定义变量 matrixname。
>> y=matrixname(4)
未定义与 'double' 类型的输入参数相对应的函数 'matrixname'。