注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

点点滴滴

感悟人生,享受精彩。

 
 
 

日志

 
 

第1章 矩阵及其基本运算  

2009-03-30 15:49:32|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
第1章  矩阵及其基本运算
MATLAB,即“矩阵实验室”,它是以矩阵为基本运算单元。因此,本书从最基本的运算单元出发,介绍MATLAB的命令及其用法。
1.1  矩阵的表示
1.1.1  数值矩阵的生成
1.实数值矩阵输入
MATLAB的强大功能之一体现在能直接处理向量或矩阵。当然首要任务是输入待处理的向量或矩阵。
不管是任何矩阵(向量),我们可以直接按行方式输入每个元素:同一行中的元素用逗号(,)或者用空格符来分隔,且空格个数不限;不同的行用分号(;)分隔。所有元素处于一方括号([ ])内;当矩阵是多维(三维以上),且方括号内的元素是维数较低的矩阵时,会有多重的方括号。如:
>> Time = [11  12  1  2  3  4  5  6  7  8  9  10]
Time =
11  12  1  2  3  4  5  6  7  8  9  10
>> X_Data = [2.32  3.43;4.37  5.98]
X_Data =
2.43  3.43
4.37  5.98
>> vect_a = [1  2  3  4  5]
vect_a =
1  2  3  4  5
>> Matrix_B = [1  2  3;
>>          2  3  4;3  4  5]
Matrix_B = 1  2  3
2  3  4
3  4  5
>> Null_M = [ ]           %生成一个空矩阵
2.复数矩阵输入
复数矩阵有两种生成方式:
第一种方式
例1-1
>> a=2.7;b=13/25;
>> C=[1,2*a+i*b,b*sqrt(a); sin(pi/4),a+5*b,3.5+1]
C=
   1.0000             5.4000 + 0.5200i   0.8544         
   0.7071             5.3000             4.5000         
第2种方式
例1-2
>> R=[1 2 3;4 5 6], M=[11 12 13;14 15 16]
R =
  1     2     3
  4     5     6
M =
  11    12    13
  14    15    16
>> CN=R+i*M
CN =
   1.0000 +11.0000i   2.0000 +12.0000i   3.0000 +13.0000i
   4.0000 +14.0000i   5.0000 +15.0000i   6.0000 +16.0000i
1.1.2  符号矩阵的生成
在MATLAB中输入符号向量或者矩阵的方法和输入数值类型的向量或者矩阵在形式上很相像,只不过要用到符号矩阵定义函数sym,或者是用到符号定义函数syms,先定义一些必要的符号变量,再像定义普通矩阵一样输入符号矩阵。
1.用命令sym定义矩阵:
这时的函数sym实际是在定义一个符号表达式,这时的符号矩阵中的元素可以是任何的符号或者是表达式,而且长度没有限制,只是将方括号置于用于创建符号表达式的单引号中。如下例:
例1-3
>> sym_matrix = sym('[a b c;Jack,Help Me!,NO WAY!],')
sym_matrix =
[a         b          c]
[Jack   Help Me!   NO WAY!]
>> sym_digits = sym('[1 2 3;a b c;sin(x)cos(y)tan(z)]')
sym_digits =
[1        2        3]
[a        b        c]
[sin(x)cos(y)tan(z)]
2.用命令syms定义矩阵
先定义矩阵中的每一个元素为一个符号变量,而后像普通矩阵一样输入符号矩阵。
例1-4
>> syms  a  b  c ;
>> M1 = sym('Classical');
>> M2 = sym(' Jazz');
>> M3 = sym('Blues')
>> syms_matrix = [a  b  c; M1, M2, M3;int2str([2  3  5])]
syms_matrix =
[   a      b     c]
[Classical  Jazz  Blues]
[   2      3     5]
把数值矩阵转化成相应的符号矩阵。
数值型和符号型在MATLAB中是不相同的,它们之间不能直接进行转化。MATLAB提供了一个将数值型转化成符号型的命令,即sym。
例1-5
>> Digit_Matrix = [1/3  sqrt(2) 3.4234;exp(0.23) log(29) 23^(-11.23)]
>> Syms_Matrix = sym(Digit_Matrix)
结果是:
Digit_Matrix =
0.3333    1.4142    3.4234
1.2586    3.3673    0.0000
Syms_Matrix =
[            1/3,                   sqrt(2),                17117/5000]
[5668230535726899*2^(-52),7582476122586655*2^(-51),5174709270083729*2^(-103)]
注意:矩阵是用分数形式还是浮点形式表示的,将矩阵转化成符号矩阵后,都将以最接近原值的有理数形式表示或者是函数形式表示。
1.1.3  大矩阵的生成
对于大型矩阵,一般创建M文件,以便于修改:
例1-6  用M文件创建大矩阵,文件名为example.m
exm=[ 456    468   873    2  579   55
21    687   54   488    8   13
65   4567   88    98   21    5
456    68  4589  654    5  987
5488   10     9    6    33  77]
在MATLAB窗口输入:
>>example;
>>size(exm)   %显示exm的大小
ans=
    5  6      %表示exm有5行6列。
1.1.4  多维数组的创建
函数  cat
格式  A=cat(n,A1,A2,…,Am)
说明  n=1和n=2时分别构造[A1;A2]和[A1,A2],都是二维数组,而n=3时可以构造出三维数组。
例1-7
>> A1=[1,2,3;4,5,6;7,8,9];A2=A1';A3=A1-A2;
>> A4=cat(3,A1,A2,A3)
A4(:,:,1) =
     1     2     3
     4     5     6
     7     8     9
A4(:,:,2) =
     1     4     7
     2     5     8
     3     6     9
A4(:,:,3) =
     0    -2    -4
     2     0    -2
     4     2     0
或用另一种原始方式可以定义:
例1-8
>> A1=[1,2,3;4,5,6;7,8,9];A2=A1';A3=A1-A2;
>> A5(:,:,1)=A1, A5(:,:,2)=A2, A5(:,:,3)=A3
A5(:,:,1) =
     1     2     3
     4     5     6
     7     8     9
A5(:,:,2) =
     1     4     7
     2     5     8
     3     6     9
A5(:,:,3) =
     0    -2    -4
     2     0    -2
     4     2     0
1.1.5  特殊矩阵的生成
命令  全零阵
函数  zeros
格式  B = zeros(n)            %生成n×n全零阵
B = zeros(m,n)          %生成m×n全零阵
B = zeros([m n])        %生成m×n全零阵
B = zeros(d1,d2,d3…)    %生成d1×d2×d3×…全零阵或数组
B = zeros([d1 d2 d3…])   %生成d1×d2×d3×…全零阵或数组
B = zeros(size(A))       %生成与矩阵A相同大小的全零阵
命令  单位阵
函数  eye
格式  Y  =  eye(n)          %生成n×n单位阵
Y  =  eye(m,n)        %生成m×n单位阵
Y  =  eye(size(A))     %生成与矩阵A相同大小的单位阵
命令  全1阵
函数  ones
格式  Y = ones(n)             %生成n×n全1阵
Y = ones(m,n)           %生成m×n全1阵
Y = ones([m n])          %生成m×n全1阵
Y = ones(d1,d2,d3…)      %生成d1×d2×d3×…全1阵或数组
Y = ones([d1 d2 d3…])     %生成d1×d2×d3×…全1阵或数组
Y = ones(size(A))         %生成与矩阵A相同大小的全1阵
命令  均匀分布随机矩阵
函数  rand
格式  Y = rand(n)          %生成n×n随机矩阵,其元素在(0,1)内
Y = rand(m,n)        %生成m×n随机矩阵
Y = rand([m n])       %生成m×n随机矩阵
Y = rand(m,n,p,…)     %生成m×n×p×…随机矩阵或数组
Y = rand([m n p…])    %生成m×n×p×…随机矩阵或数组
Y = rand(size(A))      %生成与矩阵A相同大小的随机矩阵
rand                 %无变量输入时只产生一个随机数
s = rand('state')         %产生包括均匀发生器当前状态的35个元素的向量
rand('state', s)               %使状态重置为s
rand('state', 0)               %重置发生器到初始状态
rand('state', j)                %对整数j重置发生器到第j个状态
rand('state', sum (100*clock))   %每次重置到不同状态
例1-9  产生一个3×4随机矩阵
>> R=rand(3,4)
R =
  0.9501    0.4860    0.4565    0.4447
  0.2311    0.8913    0.0185    0.6154
  0.6068    0.7621    0.8214    0.7919
例1-10  产生一个在区间[10, 20]内均匀分布的4阶随机矩阵
>> a=10;b=20;
>> x=a+(b-a)*rand(4)
x =
   19.2181   19.3547   10.5789   11.3889
   17.3821   19.1690   13.5287   12.0277
   11.7627   14.1027   18.1317   11.9872
   14.0571   18.9365   10.0986   16.0379
命令  正态分布随机矩阵
函数  randn
格式  Y = randn(n)           %生成n×n正态分布随机矩阵
Y = randn(m,n)         %生成m×n正态分布随机矩阵
Y = randn([m n])        %生成m×n正态分布随机矩阵
Y = randn(m,n,p,…)     %生成m×n×p×…正态分布随机矩阵或数组
Y = randn([m n p…])     %生成m×n×p×…正态分布随机矩阵或数组
Y = randn(size(A))      %生成与矩阵A相同大小的正态分布随机矩阵
randn                 %无变量输入时只产生一个正态分布随机数
s = randn('state')        %产生包括正态发生器当前状态的2个元素的向量
s = randn('state', s)       %重置状态为s
s = randn('state', 0)      %重置发生器为初始状态
s = randn('state', j)       %对于整数j重置状态到第j状态
s = randn('state', sum(100*clock))    %每次重置到不同状态
例1-11  产生均值为0.6,方差为0.1的4阶矩阵
>> mu=0.6; sigma=0.1;
>> x=mu+sqrt(sigma)*randn(4)
x =
    0.8311    0.7799    0.1335    1.0565
    0.7827    0.5192    0.5260    0.4890
    0.6127    0.4806    0.6375    0.7971
    0.8141    0.5064    0.6996    0.8527
命令  产生随机排列
函数  randperm
格式  p = randperm(n)     %产生1~n之间整数的随机排列
例1-12
>> randperm(6)
ans =
     3     2     1     5     4     6
命令  产生线性等分向量
函数  linspace
格式  y = linspace(a,b)     %在(a, b)上产生100个线性等分点
y = linspace(a,b,n)    %在(a, b)上产生n个线性等分点
命令  产生对数等分向量
函数  logspace
格式  y = logspace(a,b)     %在(
        )之间产生50个对数等分向量
y = logspace(a,b,n)
y = logspace(a,pi)
命令  计算矩阵中元素个数
n = numel(a)    %返回矩阵A的元素的个数
命令  产生以输入元素为对角线元素的矩阵
函数  blkdiag
格式  out = blkdiag(a,b,c,d,…)   %产生以a,b,c,d,…为对角线元素的矩阵
例1-13
>> out = blkdiag(1,2,3,4)
out =
     1     0     0     0
     0     2     0     0
     0     0     3     0
     0     0     0     4
命令  友矩阵
函数  compan
 
格式  A = compan(u)    %u为多项式系统向量,A为友矩阵,A的第1行元素为      -u (2:n)/u(1),其中u (2:n)为u的第2到第n个元素,A为特征值就是多项式的特征根。
例1-14  求多项式                               的友矩阵和根
>> u=[1 0 -7 6];
>> A=compan(u)    %求多项式的友矩阵
A =
   0     7    -6
     1     0     0
     0     1     0
>> eig(A)     %A的特征值就是多项式的根
ans =
  -3.0000
  2.0000
  1.0000
命令  hadamard矩阵
函数  hadamard
格式  H = hadamard(n)     %返回n阶hadamard矩阵
例1-15
>> h=hadamard(4)
h =
   1     1     1     1
     1    -1     1    -1
     1     1    -1    -1
     1    -1    -1     1
命令  Hankel方阵
函数  hankel
格式  H = hankel(c)     %第1列元素为c,反三角以下元素为0。
H = hankel(c,r)   %第1列元素为c,最后一行元素为r,如果c的最后一个元素与r的第一个元素不同,交叉位置元素取为c的最后一个元素。
例1-16
>> c=1:3,r=7:10
c =
     1     2     3
r =
     7     8     9    10
>> h=hankel(c,r)
h =
     1     2     3     8
     2     3     8     9
     3     8     9    10
命令  Hilbert矩阵
函数  hilb
格式  H = hilb(n)     %返回n阶Hilbert矩阵,其元素为H(i,j)=1/(i+j-1)。
例1-17  产生一个3阶Hilbert矩阵
>> format rat      %以有理形式输出
>> H=hilb(3)
H =
      1           1/2          1/3    
     1/2          1/3          1/4    
     1/3          1/4          1/5    
命令  逆Hilbert矩阵
函数  invhilb
格式  H = invhilb(n)    %产生n阶逆Hilbert矩阵
命令  Magic(魔方)矩阵
函数  magic
格式  M = magic(n)    %产生n 阶魔方矩阵
例1-18
>> M=magic(3)
M =
      8            1            6     
      3            5            7     
      4            9            2     
命令  Pascal矩阵
函数  pascal
格式  A = pascal(n)      %产生n阶Pascal矩阵,它是对称、正定矩阵,它的元素由Pascal三角组成,它的逆矩阵的所有元素都是整数。
A = pascal(n,1)     %返回由下三角的Cholesky系数组成的Pascal矩阵
A = pascal(n,2)     %返回Pascal(n,1)的转置和交换的形式
例1-19
>> A=pascal(4)
A =
      1            1            1            1     
      1            2            3            4     
      1            3            6           10     
      1            4           10           20     
>> A=pascal(3,1)
A =
      1            0            0     
      1           -1            0     
      1           -2            1     
>> A=pascal(3,2)
A =
      1            1            1     
     -2           -1            0     
      1            0            0     
命令  托普利兹矩阵
函数  toeplitz
格式  T = toeplitz(c,r)    %生成一个非对称的托普利兹矩阵,将c作为第1列,将r作为第1 行,其余元素与左上角相邻元素相等。
T = toeplitz(r)      %用向量r生成一个对称的托普利兹矩阵
例1-20
>> c=[1 2 3 4 5];
>> r=[1.5 2.5 3.5 4.5 5.5];
>> T=toeplitz(c,r)
T =
      1           5/2          7/2          9/2         11/2    
      2            1           5/2          7/2          9/2    
      3            2            1           5/2          7/2    
      4            3            2            1           5/2    
      5            4            3            2            1     
命令  Wilkinson特征值测试阵
函数  wilkinson
格式  W = wilkinson(n)    %返回n阶Wilkinson特征值测试阵
例1-21
>> W=wilkinson(4)
W =
     3/2           1            0            0     
      1           1/2           1            0     
      0            1           1/2           1     
      0            0            1           3/2    
>> W=wilkinson(7)
W =
      3     1      0      0       0       0         0   
      1     2      1      0       0       0         0   
      0     1      1      1       0       0         0   
      0     0      1      0       1       0         0   
      0     0      0      1       1       1         0   
      0     0      0      0       1       2         1   
      0     0      0      0       0       1         3   
1.2  矩阵运算
1.2.1  加、减运算
运算符:“+”和“-”分别为加、减运算符。
运算规则:对应元素相加、减,即按线性代数中矩阵的“十”,“一”运算进行。
例1-22 
>>A=[1, 1, 1; 1, 2, 3; 1, 3, 6]
>>B=[8, 1, 6; 3, 5, 7; 4, 9, 2]
>>A+B=A+B
>>A-B=A-B
结果显示:A+B=
9   2   7
4   7  10
5  12   8
A-B=
-7    0   -5
-2    -3   -4
-3    -6    4
1.2.2  乘法
运算符:*
运算规则:按线性代数中矩阵乘法运算进行,即放在前面的矩阵的各行元素,分别与放在后面的矩阵的各列元素对应相乘并相加。
1.两个矩阵相乘
例1-23
>>X= [2  3  4  5;
      1  2  2  1];
>>Y=[0  1  1;
     1  1  0;
     0  0  1;
     1  0  0];
Z=X*Y
结果显示为:
Z=
   8  5  6
   3  3  3
2.矩阵的数乘:数乘矩阵
上例中:a=2*X
则显示:a =
4  6  8  10
2  4  4  2
向量的点乘(内积):维数相同的两个向量的点乘。
数组乘法:
A.*B表示A与B对应元素相乘。
3.向量点积
函数  dot
格式  C = dot(A,B)       %若A、B为向量,则返回向量A与B的点积,A与B长度相同;若为矩阵,则A与B有相同的维数。
C = dot(A,B,dim)    %在dim维数中给出A与B的点积
例      >>X=[-1  0  2];
>>Y=[-2  -1  1];
>>Z=dot(X, Y)
则显示:Z =
4
还可用另一种算法:
sum(X.*Y)
ans=
     4
4.向量叉乘
在数学上,两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中,用函数cross实现。
函数  cross
格式  C = cross(A,B)   %若A、B为向量,则返回A与B的叉乘,即C=A×B,A、B必须是3个元素的向量;若A、B为矩阵,则返回一个3×n矩阵,其中的列是A与B对应列的叉积,A、B都是3×n矩阵。
C = cross(A,B,dim)   %在dim维数中给出向量A与B的叉积。A和B必须具有相同的维数,size(A,dim)和size(B,dim)必须是3。
例1-24  计算垂直于向量(1, 2, 3)和(4, 5, 6)的向量。
   >>a=[1  2  3];
   >>b=[4  5  6];
   >>c=cross(a,b)
结果显示:
    c=
       -3     6    -3
可得垂直于向量(1, 2, 3)和(4, 5, 6)的向量为±(-3, 6, -3)
5.混合积
混合积由以上两函数实现:
例1-25  计算向量a=(1, 2, 3)、b=(4, 5, 6)和c=(-3, 6, -3) 的混合积
解:
>>a=[1  2  3]; b=[4  5  6]; c=[-3  6  -3];
>>x=dot(a, cross(b, c))
结果显示:x =
              54
注意:先叉乘后点乘,顺序不可颠倒。
6.矩阵的卷积和多项式乘法
函数  conv
格式  w = conv(u,v)   %u、v为向量,其长度可不相同。
说明  长度为m的向量序列u和长度为n的向量序列v的卷积(Convolution)定义为: 式中:w向量序列的长度为(m+n-1),当m=n时,
w(1) = u(1)*v(1)
w(2) = u(1)*v(2)+u(2)*v(1)
w(3) = u(1)*v(3)+u(2)*v(2)+u(3)*v(1)

w(n) = u(1)*v(n)+u(2)*v(n-1)+ … +u(n)*v(1)

w(2*n-1) = u(n)*v(n)
例1-26  展开多项式
解:>> w=conv([1,2,2],conv([1,4],[1,1]))
w =
    1     7    16    18     8
>> P=poly2str(w,'s')    %将w表示成多项式
P =
  s^4 + 7 s^3 + 16 s^2 + 18 s + 8
7.反褶积(解卷)和多项式除法运算
函数  deconv
格式  [q,r] = deconv(v,u)  %多项式v除以多项式u,返回商多项式q和余多项式r。
 
注意:v、u、q、r都是按降幂排列的多项式系数向量。
例1-27                                 ,则其卷积为
>>u = [1   2   3   4]
>>v = [10   20   30]
>>c = conv(u,v)
c =
   10     40     100     160     170     120
则反褶积为
>>[q,r] = deconv(c,u)
q =
   10    20    30
r =
   0      0      0      0      0      0
8.张量积
函数  kron
格式  C=kron (A,B)   %A为m×n矩阵,B为p×q矩阵,则C为mp×nq矩阵。
说明  A与B的张量积定义为: A B与B A均为mp×nq矩阵,但一般地A B B A。
例1-28          求A B。
>> A=[1 2;3 4];B=[1 2 3;4 5 6;7 8 9];
>> C=kron(A,B)
C =
    1     2     3     2     4     6
    4     5     6     8     10    12
    7     8     9     14    16    18
    3     6     9     4     8     12
    12    15    18    16    20    24
    21    24    27    28    32    36
1.2.3  集合运算
1.两个集合的交集
函数  intersect
格式  c = intersect(a,b)         %返回向量a、b的公共部分,即c= a∩b。
c = intersect(A,B,'rows')   %A、B为相同列数的矩阵,返回元素相同的行。
[c,ia,ib] = intersect(a,b)   %c为a、b的公共元素,ia表示公共元素在a中的位置,ib表示公共元素在b中位置。
例1-29
>> A=[1 2 3 4;1 2 4 6;6 7 1 4]
A =
    1     2     3     4
    1     2     4     6
    6     7     1     4
>> B=[1 2 3 8;1 1 4 6;6 7 1 4]
B =
    1     2     3     8
    1     1     4     6
    6     7     1     4
>> C=intersect(A,B,'rows')
C =
    6     7     1     4
例1-30
>> A = [1 9 6 20]; B = [1 2 3 4 6 10 20];
>> [c,ia,ib] = intersect(A,B)
c =
     1     6    20
ia =
     1     3     4
ib =
     1     5     7
2.检测集合中的元素
函数  ismember
格式  k = ismember(a,S)         %当a中元素属于S时,k取1,否则,k取0。
k = ismember(A,S,'rows')   %A、S有相同的列,返回行相同k取1,不相同取0的列向量。
例1-31
>> S=[0  2  4  6  8  10  12  14  16  18  20];
>> a=[1  2  3  4  5  6];
>> k=ismember(a,S)
k =
     0     1     0     1     0     1     %1表示相同元素的位置
例1-32
>> A=[1 2 3 4;1 2 4 6;6 7 1 4]
>> B=[1 2 3 8;1 1 4 6;6 7 1 4]
>> k=ismember(A,B,'rows')
k =
   0
     0
     1         %1表示元素相同的行
3.两集合的差
函数  setdiff
格式  c = setdiff(a,b)         %返回属于a但不属于b的不同元素的集合,C = a-b。
c = setdiff(A,B,'rows')   %返回属于A但不属于B的不同行
[c,i] = setdiff(…)        %c与前面一致,i表示c中元素在A中的位置。
例1-33
>> A = [1 7 9 6 20]; B = [1 2 3 4 6 10 20];
>> c=setdiff(A,B)
c =
     7     9
例1-34
>> A=[1 2 3 4;1 2 4 6;6 7 1 4]
>> B=[1 2 3 8;1 1 4 6;6 7 1 4]
>> c=setdiff(A,B,'rows')
c =
     1     2     3     4
     1     2     4     6
4.两个集合交集的非(异或)
函数  setxor
格式  c = setxor(a,b)         %返回集合a、b交集的非
c = setxor(A,B,'rows')   %返回矩阵A、B交集的非,A、B有相同列数。
[c,ia,ib] = setxor(…)     %ia、ib表示c中元素分别在a (或A)、b(或B)中位置
例1-35
>> A=[1  2  3  4];
>> B=[2  4  5  8];
>> C=setxor(A,B)
C =
     1     3     5     8
例1-36
>> A=[1 2 3 4;1 2 4 6;6 7 1 4]
A =
     1     2     3     4
     1     2     4     6
     6     7     1     4
>> B=[1 2 3 8;1 1 4 6;6 7 1 4]
B =
     1     2     3     8
     1     1     4     6
     6     7     1     4
>> [C,ia,ib]=setxor(A,B,'rows')
C =
     1     1     4     6
     1     2     3     4
     1     2     3     8
     1     2     4     6
ia =
     1
     2
ib =
     2
     1
5.两集合的并集
函数  union
格式  c = union(a,b)         %返回a、b的并集,即c = a∪b。
c = union(A,B,'rows')   %返回矩阵A、B不同行向量构成的大矩阵,其中相同行向量只取其一。
[c,ia,ib] = union(…)     %ia、ib分别表示c中行向量在原矩阵(向量)中的位置
例1-37
>> A=[1 2 3 4];
>> B=[2 4 5 8];
>> c=union(A,B)
则结果为
c =
     1     2     3     4     5     8
例1-38
>> A=[1 2 3 4;1 2 4 6]
A =
     1     2     3     4
     1     2     4     6
>> B=[1 2 3 8;1 1 4 6]
B =
     1     2     3     8
     1     1     4     6
>> [c,ia,ib]=union(A,B,'rows')
c =
     1     1     4     6
     1     2     3     4
     1     2     3     8
     1     2     4     6
ia =
     1
     2
ib =
     2
     1
6.取集合的单值元素
函数
格式  b = unique (a)         %取集合a的不重复元素构成的向量
b = unique (A,'rows')   %返回A、B不同行元素组成的矩阵
[b,i,j] = unique (…)     %i、j体现b中元素在原向量(矩阵)中的位置
例1-39
>> A=[1 1 2 2 4 4 6  4  6]
A =
     1     1     2     2     4     4     6     4     6
>> [c,i,j]=unique(A)
c =
     1     2     4     6
i =
     2     4     8     9
j =
   1     1     2     2     3     3     4     3     4
例1-40
>> A=[1 2 2 4;1 1 4 6;1 1 4 6]
A =
   1     2     2     4
     1     1     4     6
     1     1     4     6
>> [c,i,j]=unique(A,'rows')
c =
     1     1     4     6
     1     2     2     4
i =
     3
     1
j =
     2
     1
     1
1.2.4  除法运算
Matlab提供了两种除法运算:左除()和右除(/)。一般情况下,x=a是方程a*x =b的解,而x=b/a是方程x*a=b的解。
例:a=[1  2  3; 4  2  6; 7  4  9]
b=[4; 1; 2];
x=a
则显示:x=
-1.5000
           2.0000
0.5000
如果a为非奇异矩阵,则a和b/a可通过a的逆矩阵与b阵得到:
       a = inv(a)*b
       b/a = b*inv(a)
数组除法:
A./B表示A中元素与B中元素对应相除。
1.2.5  矩阵乘方
运算符:^
运算规则:
(1)当A为方阵,P为大于0的整数时,A^P表示A的P次方,即A自乘P次;P为小于0的整数时,A^P表示A-1的P次方。
(2)当A为方阵,p为非整数时,则 其中V为A的特征向量, 为特征值对角矩阵。如果有重根,以上指令不成立。
(3)标量的矩阵乘方PA,标量的矩阵乘方定义为 式中V,D取自特征值分解AV=AD。
(4)标量的数组乘方P.^A,标量的数组乘方定义为 数组乘方:A.^P:表示A的每个元素的P次乘方。
1.2.6  矩阵函数
命令  方阵指数
函数  expm
格式  Y = expm(A)   %使用Pade近似算法计算eA,这是一个内部函数,A为方阵。
      Y=expm1(A)   %使用一个M文件和内部函数相同的算法计算eA
      Y=expm2(A)   %使用泰勒级数计算eA
      Y=expm3(A)   %使用特征值和特征向量计算eA
命令  矩阵的对数
函数  logm
格式  Y = logm(X)         %计算矩阵X的对数,它是expm(X)的反函数。
[Y,esterr] = logm(X)   %esterr为相对残差的估计值:norm(expm(Y)-X)/norm(X)
例1-41
>> A=[1 1 0;0 0 2;0 0 -1];
>> Y=expm(A)
Y =
   2.7183    1.7183    1.0862
        0    1.0000    1.2642
        0         0    0.3679
>> A=logm(Y)
A =
   1.0000    1.0000    0.0000
       0         0    2.0000
         0         0   -1.0000
命令  方阵的函数
函数  funm
格式  F = funm(A,fun)        %A为方阵,计算由fun指定的A的矩阵函数,fun可以是任意基本函数,如sin、cos等等,例如:funm(A, ’exp’)=expm(A)。
[F,esterr] = funm(A,fun)   %esterr为结果所产生的相对误差的估计值。
命令  矩阵的方根
函数  sqrtm
格式  X = sqrtm(A)   %矩阵A的平方根A1/2,相当于X*X=A,求X。若A的特征值有非负实部,则X是唯一的;若A的特征值有负的实部,则X为复矩阵;若A为奇异矩阵,则X不存在。
[X,resnorm] = sqrtm(A)       % resnorm为结果产生的相对误差
[X,alpha,condest] = sqrtm(A)   % alpha为稳定因子,condest为结果的条件数的估计值。
命令  矩阵A的多项式
函数  polyvalm
格式  polyvalm(P, A)   %P为多项式系数向量,方阵A为多项式变量,返回多项式值。
1.2.7  矩阵转置
运算符:′
运算规则:若矩阵A的元素为实数,则与线性代数中矩阵的转置相同。
若A为复数矩阵,则A转置后的元素由A对应元素的共轭复数构成。
若仅希望转置,则用如下命令:A.′。
1.2.8  方阵的行列式
函数  det
格式  d = det(X)    %返回方阵X的多项式的值
例1-42
>> A=[1 2 3;4 5 6;7 8 9]
A =
   1     2     3
     4     5     6
     7     8     9
>> D=det(A)
D =
     0
1.2.9  逆与伪逆
命令  逆
函数  inv
格式  Y=inv(X)   %求方阵X的逆矩阵。若X为奇异阵或近似奇异阵,将给出警告信息。
例1-43  求 的逆矩阵
方法一
>>A=[1  2  3; 2  2  1; 3  4  3];
>>Y=inv(A)或Y=A^(-1)
则结果显示为
 Y =
      1.0000    3.0000   -2.0000
      -1.5000   -3.0000    2.5000
      1.0000    1.0000   -1.0000
方法二:由增广矩阵 进行初等行变换
>>B=[1, 2, 3, 1, 0, 0; 2, 2, 1, 0, 1, 0; 3, 4, 3, 0, 0, 1];
>>C=rref(B)     %化行最简形
>>X=C(:, 4:6)    %取矩阵C中的A^(-1)部分
显示结果如下:
C =
    1.0000         0         0    1.0000    3.0000   -2.0000
         0    1.0000         0   -1.5000   -3.0000    2.5000
         0         0    1.0000    1.0000    1.0000   -1.0000
X =
    1.0000    3.0000   -2.0000
   -1.5000   -3.0000    2.5000
    1.0000    1.0000   -1.0000
例1-44
>> A=[2 1 -1;2 1 2;1 -1 1];
>> format rat    %用有理格式输出
>> D=inv(A)
D =
     1/3           0           1/3    
      0           1/3         -2/3    
    -1/3          1/3           0     
命令  伪逆
函数  pinv
格式  B = pinv(A)      %求矩阵A的伪逆
      B = pinv(A, tol)   %tol为误差:max(size(A))*norm(A)*eps
说明  当矩阵为长方阵时,方程AX=I和XA=I至少有一个无解,这时A的伪逆能在某种程度上代表矩阵的逆,若A为非奇异矩阵,则pinv(A) = inv(A)。
例1-45
>> A=magic(5);   %产生5阶魔方阵。
>> A=A(:,1:4)    %取5阶魔方阵的前4列元素构成矩阵A。
A =
    17    24     1     8
    23     5     7    14
     4     6    13    20
    10    12    19    21
    11    18    25     2
>> X=pinv(A)    %计算A的伪逆
X =
   -0.0041    0.0527   -0.0222   -0.0132    0.0069
    0.0437   -0.0363    0.0040    0.0033    0.0038
   -0.0305    0.0027   -0.0004    0.0068    0.0355
    0.0060   -0.0041    0.0314    0.0211   -0.0315
1.2.10  矩阵的迹
函数  trace
格式  b=trace (A)   %返回矩阵A的迹,即A的对角线元素之和。
1.2.11  矩阵和向量的范数
命令  向量的范数
函数  norm
格式  n = norm(X)      %X为向量,求欧几里德范数,即 。
n = norm(X,inf)   %求 -范数,即 。
n = norm(X,1)    %求1-范数,即 。
n = norm(X,-inf)  %求向量X的元素的绝对值的最小值,即 。
n = norm(X, p)   %求p-范数,即 ,所以norm(X,2) = norm(X)。
命令  矩阵的范数
函数  norm
格式  n = norm(A)    %A为矩阵,求欧几里德范数 ,等于A的最大奇异值。
n = norm(A,1)   %求A的列范数 ,等于A的列向量的1-范数的最大值。
n = norm(A,2)   %求A的欧几里德范数 ,和norm(A)相同。
n = norm(A,inf)   %求行范数 ,等于A的行向量的1-范数的最大值
即:max(sum(abs(A')))。
n = norm(A, 'fro' )   %求矩阵A的Frobenius范数 ,
即sqrt(sum(diag(A'*A))),不能用矩阵p-范数的定义来求。
命令  范数的估计值
函数  normest
格式  nrm = normest(A)         %矩阵A的2-范数(欧几里德范数)的估计值,相对误差小于106。
nrm = normest(A,tol)       %tol为指定相对误差
[nrm,count] = normest(…)   %count给出计算估计值的迭代次数
1.2.12  条件数
命令  矩阵的条件数
函数  cond
格式  c = cond(X)   %求X的2-范数的条件数,即X的最大奇异值和最小奇异值的商。
c = cond(X,p)   %求p-范数的条件数,p的值可以是1、2、inf或者’fro’。
说明  线性方程组AX=b的条件数是一个大于或者等于1的实数,用来衡量关于数据中的扰动,也就是A/或b对解X的灵敏度。一个差条件的方程组的条件数很大。条件数的定义为:
命令  1-范数的条件数估计
函数  condest
格式  c = condest (A)       %方阵A的1-范数的条件数的下界估值。
[c,v] = condest (A)   %v为向量,满足 ,即norm(A*v,1) =norm(A,1)*norm(v,1)/c。
[c,v] = condest (A,t)   %求上面的c和v,同时显示出关于计算的步骤信息。如果t=1,则计算的每步都显示出来;如果t=-1,则给出商c/rcond(A)。
命令  矩阵可逆的条件数估值
函数  rcond
格式  c = rcond(A)   %对于差条件矩阵A来说,给出一个接近于0的数;对于好条件矩阵A,则给出一个接近于1的数。
命令  特征值的条件数
函数  condeig
格式  c = condeig(A)        %返回矩阵A的特征值的条件数
[V,D,c] = condeig(A)   %D为A的特征值对角阵,V为A的特征向量。
1.2.13  矩阵的秩
函数  rank
格式  k = rank (A)      %求矩阵A的秩
k = rank (A,tol)   %tol为给定误差
1.2.14  特殊运算
1.矩阵对角线元素的抽取
函数  diag
格式  X = diag(v,k)   %以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线;当k>0时,v为上方第k条对角线;当k<0时,v为下方第k条对角线。
X = diag(v)    %以v为主对角线元素,其余元素为0构成X。
v = diag(X,k)   %抽取X的第k条对角线元素构成向量v。k=0:抽取主对角线元素;k>0:抽取上方第k条对角线元素;k<0抽取下方第k条对角线元素。
v = diag(X)    %抽取主对角线元素构成向量v。
例1-46
>> v=[1 2 3];
>> x=diag(v,-1)
x =
     0     0     0     0
     1     0     0     0
     0     2     0     0
     0     0     3     0
>> A=[1 2 3;4 5 6;7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9
>> v=diag(A,1)
v =
     2
     6
2.上三角阵和下三角阵的抽取
函数  tril   %取下三角部分
格式  L = tril(X)     %抽取X的主对角线的下三角部分构成矩阵L
L = tril(X,k)    %抽取X的第k条对角线的下三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。
函数  triu    %取上三角部分
格式  U = triu(X)    %抽取X的主对角线的上三角部分构成矩阵U
U = triu(X,k)   %抽取X的第k条对角线的上三角部分;k=0为主对角线;k>0为主对角线以上;k<0为主对角线以下。
例1-47
>> A=ones(4)    %产生4阶全1阵
A =
   1     1     1     1
     1     1     1     1
     1     1     1     1
     1     1     1     1
>> L=tril(A,1)    %取下三角部分
L =
     1     1     0     0
     1     1     1     0
     1     1     1     1
     1     1     1     1
>> U=triu(A,-1)    %取上三角部分
U =
     1     1     1     1
     1     1     1     1
     0     1     1     1
     0     0     1     1
3.矩阵的变维
矩阵的变维有两种方法,即用“:”和函数“reshape”,前者主要针对2个已知维数矩阵之间的变维操作;而后者是对于一个矩阵的操作。
(1)“:”变维
例1-48
> A=[1 2 3 4 5 6;6 7 8 9 0 1]
A =
     1     2     3     4     5     6
     6     7     8     9     0     1
>> B=ones(3,4)
B =
     1     1     1     1
     1     1     1     1
     1     1     1     1
>> B(:)=A(:)
B =
     1     7     4     0
     6     3     9     6
     2     8     5     1
(2)Reshape函数变维
格式  B = reshape(A,m,n)       %返回以矩阵A的元素构成的m×n矩阵B
B = reshape(A,m,n,p,…)   %将矩阵A变维为m×n×p×…
B = reshape(A,[m n p…])   %同上
B = reshape(A,siz)        %由siz决定变维的大小,元素个数与A中元素个数
相同。
例1-49  矩阵变维
>> a=[1:12];
>> b=reshape(a,2,6)
b =
     1     3     5     7     9    11
     2     4     6     8    10    12
4.矩阵的变向
(1)矩阵旋转
函数
格式  B = rot90 (A)    %将矩阵A逆时针方向旋转90°
B = rot90 (A,k)   %将矩阵A逆时针方向旋转(k×90°),k可取正负整数。
例1-50
>> A=[1 2 3;4 5 6;7 8 9]
A =
     1     2     3
     4     5     6
     7     8     9
>> Y1=rot90(A),Y2=rot90(A,-1)
Y1 =     %逆时针方向旋转
    3     6     9
    2     5     8
    1     4     7
Y2 =     %顺时针方向旋转
    7     4     1
    8     5     2
    9     6     3
(2)矩阵的左右翻转
函数  fliplr
格式  B = fliplr(A)   %将矩阵A左右翻转
(3)矩阵的上下翻转
函数  flipud
格式  B = flipud(A)   %将矩阵A上下翻转
例1-51
>> A=[1 2 3;4 5 6]
A =
     1     2     3
     4     5     6
>> B1=fliplr(A),B2=flipud(A)
B1 =
    3     2     1
    6     5     4
B2 =
    4     5     6
    1     2     3
(4)按指定维数翻转矩阵
函数  flipdim
格式  B = flipdim(A,dim)    % flipdim(A,1) = flipud(A),并且flipdim(A,2)=fliplr(A)。
例1-52
>> A=[1 2 3;4 5 6]
A =
     1     2     3
     4     5     6
>> B1=flipdim(A,1),B2=flipdim(A,2)
B1 =
    4     5     6
    1     2     3
B2 =
    3     2     1
    6     5     4
(5)复制和平铺矩阵
函数  repmat
格式  B = repmat(A,m,n)       %将矩阵A复制m×n块,即B由m×n块A平铺而成。
B = repmat(A,[m n])      %与上面一致
B = repmat(A,[m n p…])   %B由m×n×p×…个A块平铺而成
repmat(A,m,n)           %当A是一个数a时,该命令产生一个全由a组成的m×n矩阵。
例1-53
>> A=[1 2;5 6]
A =
     1     2
     5     6
>> B=repmat(A,3,4)
B =
     1     2       1     2       1     2       1     2
     5     6       5     6       5     6       5     6
     1     2       1     2       1     2       1     2
     5     6       5     6       5     6       5     6
     1     2       1     2       1     2       1     2
     5     6       5     6       5     6       5     6
5.矩阵的比较关系
矩阵的比较关系是针对于两个矩阵对应元素的,所以在使用关系运算时,首先应该保证两个矩阵的维数一致或其中一个矩阵为标量。关系运算是对两个矩阵的对应运算进行比较,若关系满足,则将结果矩阵中该位置元素置为1,否则置0。
MATLAB的各种比较关系运算有见表1-1。
表1-1
运算符 含义 运算符 含义 
> 大于关系 < 大于关系 
= = 等于关系 >= 大于或等于关系 
<= 小于或等于关系 ~ = 不等于关系 
例1-54
>> A=[1 2 3 4;5 6 7 8];B=[0 2 1 4;0 7 7 2];
>> C1=A==B, C2=A>=B, C3=A~=B
C1 =
    0     1     0     1
    0     0     1     0
C2 =
    1     1     1     1
    1     0     1     1
C3 =
    1     0     1     0
    1     1     0     1
6.矩阵元素的数据变换
对于小数构成的矩阵A来说,如果我们想对它取整数,有以下几种方法:
(1)按-∞方向取整
函数  floor
格式  floor(A)   %将A中元素按-∞方向取整,即取不足整数。
(2)按+∞方向取整
函数  ceil
格式  ceil(A)   %将A中元素按+∞方向取整,即取过剩整数。
(3)四舍五入取整
函数  round
格式  round (A)   %将A中元素按最近的整数取整,即四舍五入取整。
(4)按离0近的方向取整
函数  fix
格式  fix (A)   %将A中元素按离0?
  评论这张
 
阅读(298)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017