MATLAB学习笔记(2)

  • Post author:
  • Post category:其他


1.基本矩阵操作

1.1矩阵与数组的区别

在MATLAB中,一个数组是多个数组元素的有序集合,这些数组元素可以是基本数据类型或构造类型,而且数组维度是不限制的。两者间的联系主要体现在:在MATLAB中,矩阵是以数组的形式存在的。因此,一维数组就相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集。

1.2矩阵的创建

一般矩阵的创建采用一对方括号[]即可实现,其中空格或逗号分隔同一行的不同元素,分号用于区分行与行之间的元素。而特殊矩阵的生成则需要调用相关函数,这里举几个例子。
>> ones(2)%构建一个2*2的全1矩阵

ans =

     1     1
     1     1

>> zeros(2)%构建一个2*2的全0矩阵

ans =

     0     0
     0     0

>> eye(2)%构建一个2*2的单位矩阵

ans =

     1     0
     0     1

>> x = 1:8;
>> diag(x)%生成对角矩阵

ans =

     1     0     0     0     0     0     0     0
     0     2     0     0     0     0     0     0
     0     0     3     0     0     0     0     0
     0     0     0     4     0     0     0     0
     0     0     0     0     5     0     0     0
     0     0     0     0     0     6     0     0
     0     0     0     0     0     0     7     0
     0     0     0     0     0     0     0     8
>> rand(3)%生成3*3的矩阵其中元素为0~1内的随机数

ans =

    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575

>> randn(3)%生成3*3的矩阵,其元素为零均值、单位方差的随机数

ans =

    2.7694    0.7254   -0.2050
   -1.3499   -0.0631   -0.1241
    3.0349    0.7147    1.4897

当矩阵的某一维度数目为1时,矩阵就退化为向量,并且在行数与列数都为1时,建立的矩阵称为标量。当任意维度长度为0时,称其为空矩阵,其创建方法为:



矩阵名 = []

1.3矩阵的大小及结构的改变

常见的矩阵大小和结构的改变方式主要包括旋转矩阵、改变矩阵维度、删除矩阵元素等。常用函数如下:

1.3.1矩阵元素的逆序

>> X = 10 * rand(3)%生成元素为0-10以内的随机数的3阶方阵

X =

    7.9221    0.3571    6.7874
    9.5949    8.4913    7.5774
    6.5574    9.3399    7.4313

>> Y = fliplr(X)%矩阵每一行均进行逆序排列

Y =

    6.7874    0.3571    7.9221
    7.5774    8.4913    9.5949
    7.4313    9.3399    6.5574

>> Z = flipud(X)%矩阵每一列均进行逆序排列

Z =

    6.5574    9.3399    7.4313
    9.5949    8.4913    7.5774
    7.9221    0.3571    6.7874

1.3.2矩阵的旋转

>> P = eye(3)

P =

     1     0     0
     0     1     0
     0     0     1

>> Q = rot90(P)%逆时针旋转90度

Q =

     0     0     1
     0     1     0
     1     0     0

1.3.3矩阵形状改变

这里可以使用reshape函数,其将按顺序摆放各元素,但要求改变前后元素个数相等。
>> P = eye(4)

P =

     1     0     0     0
     0     1     0     0
     0     0     1     0
     0     0     0     1

>> reshape(P, 2, 8)%将P改为2行8列的矩阵,元素顺序摆放

ans =

     1     0     0     0     0     1     0     0
     0     0     1     0     0     0     0     1

1.4矩阵下标的引用

在MATLAB中,普通二维数组的索引分为双下标索引与单下标索引。双下标索引是通过元素在矩阵中的行列位置来确定元素,单下标索引则是采用列元素优先的原则,对m行n列的矩阵按列排序进行重组,成为一维数组,再取新的元素位置的值作为元素在原矩阵中的单下标。
(1).矩阵下标访问单个矩阵元素。


这里引用《MATLAB R2014a完全自学一本通》的表格来总结。

相关示例代码如下:
>> A = [1 2 3;4 5 6;7 8 9]

A =

     1     2     3
     4     5     6
     7     8     9

>> A(1)%返回第1个元素

ans =

     1

>> A(:,2)%返回第2列

ans =

     2
     5
     8

>> A(1,:)%返回第1行

ans =

     1     2     3

>> A(:,1:2)%返回第1到2列

ans =

     1     2
     4     5
     7     8

>> A(1:2,3)%返回第1到2行中的第3列

ans =

     3
     6

>> A(1:2,:)%返回第1到2行

ans =

     1     2     3
     4     5     6

>> A(1:2,2:3)%返回第1到2行中的第2到3列

ans =

     2     3
     5     6

>> A(:)%将所有列按顺序合并为一列

ans =

     1
     4
     7
     2
     5
     8
     3
     6
     9

>> A(1:2)%取上面合并后的1到2个元素组成的行

ans =

     1     4
>> A(:,[1 3])%返回第1、3列元素

ans =

     1     3
     4     6
     7     9

>> A([1 3],:)%返回第1、3行元素

ans =

     1     2     3
     7     8     9

>> A([1 3], [1 3])%返回矩阵第1、3列与第1、3行的元素

ans =

     1     3
     7     9

(2).单下标索引与双下标索引之间的变换,其语法格式为:



IND = sub2ind(size(矩阵名), i, j)%IND为转换后单下标索引值,i、j分别为其双下标索引的行列值。


[I, J] = ind2sub(size(矩阵名), IND)%符号含义同上

>> A = [1 2 3; 4 5 6; 7 8 9];
>> IND = sub2ind(size(A), 2, 2)

IND =

     5

>> [i, j] = ind2sub(size(A), 7)

i =

     1


j =

     3

(3).访问多个矩阵的元素。例如要计算矩阵A(3*3)中第三列所有元素之和,固然可以用A(1, 3)+A(2, 3)+A(3, 3)。但当矩阵阶数变大时,将不太简便。为此MATLAB中提供了一个关键字end,用于表示该维中最后一个元素。示例如下:

>> A = [1 2 3;4 5 6;7 8 9]

A =

     1     2     3
     4     5     6
     7     8     9

>> sum(A(:,end))

ans =

    18

1.5矩阵属性信息的获取

矩阵属性信息包括矩阵结构、大小、维度、数据类型以及其内存占用情况。其中最重要的为矩阵大小的确定,使用size函数即可。

1.6矩阵的合并

常用的几个函数总结如下:
(1)cat函数,其格式如下:


合并后的矩阵名 = cat(DIM, 要合并的矩阵A, 要合并的矩阵B)
其中DIM=1表示按行合并,DIM=2表示按列合并。
(2).水平合并函数:horzcat(A, B)
(3).垂直合并函数:vertcat(A, B)
>> A = [1 2 3;4 5 6;7 8 9];
>> B = eye(3);
>> C = cat(1, A, B)

C =

     1     2     3
     4     5     6
     7     8     9
     1     0     0
     0     1     0
     0     0     1

>> D = cat(2, A, B)

D =

     1     2     3     1     0     0
     4     5     6     0     1     0
     7     8     9     0     0     1

>> C1 = horzcat(A, B)

C1 =

     1     2     3     1     0     0
     4     5     6     0     1     0
     7     8     9     0     0     1

>> D1 = vertcat(A, B)

D1 =

     1     2     3
     4     5     6
     7     8     9
     1     0     0
     0     1     0
     0     0     1

(4).repmat函数可以通过复制(平铺)M*N个矩阵A构造一个新的大矩阵,其格式如下:



拓展后矩阵名 = repmat(A, M, N)
(5).blkdiag函数用于构造对角化矩阵,其格式如下:


构造后矩阵名 = blkdiag(矩阵1, 矩阵2,……)
>> A = [1 2 3;4 5 6];
>> C = repmat(A, 3, 2)

C =

     1     2     3     1     2     3
     4     5     6     4     5     6
     1     2     3     1     2     3
     4     5     6     4     5     6
     1     2     3     1     2     3
     4     5     6     4     5     6

>> B = eye(2);
>> D = blkdiag(A, B)

D =

     1     2     3     0     0
     4     5     6     0     0
     0     0     0     1     0
     0     0     0     0     1

2.运算符

2.1算术运算符

2.1.1*与.*、/与./、^与.^的区别

(1).A * B即矩阵A与矩阵B相乘,而A.*B则是指A与B中对应元素相乘(要求A与B为相同维度的矩阵)。
(2).A / B即矩阵A右除矩阵B,而A./B则是指A与B对应元素相乘(要求A与B为相同维度的矩阵)。
(3).A ^B即矩阵A的B次幂,这里B须为一标量,而A.^B则是指A与B对应元素的幂次(要求A与B为相同维度的矩阵)。
以下示例中C为1.6中所得到的C
>> D = C'

D =

     1     4     1     4     1     4
     2     5     2     5     2     5
     3     6     3     6     3     6
     1     4     1     4     1     4
     2     5     2     5     2     5
     3     6     3     6     3     6

>> D * D

ans =

    30    75    30    75    30    75
    42   105    42   105    42   105
    54   135    54   135    54   135
    30    75    30    75    30    75
    42   105    42   105    42   105
    54   135    54   135    54   135

>> D .* D

ans =

     1    16     1    16     1    16
     4    25     4    25     4    25
     9    36     9    36     9    36
     1    16     1    16     1    16
     4    25     4    25     4    25
     9    36     9    36     9    36

>> D ^ D
错误使用  ^ 
输入必须为标量和方阵。
要按元素进行 POWER 计算,请改用 POWER (.^)。
 
>> D .^ D

ans =

           1         256           1         256           1         256
           4        3125           4        3125           4        3125
          27       46656          27       46656          27       46656
           1         256           1         256           1         256
           4        3125           4        3125           4        3125
          27       46656          27       46656          27       46656

2.1.2常用运算函数

(1).基本初等函数。比如exp(x)、log(x)(即自然对数lnx)、sqrt(x)、sin(x)、asin(x)……
(2).有关基本量函数。比如max(a, b)、min(a, b)、mean(X)(计算序列均值)、median(X)(计算序列中位数)、sum(X)(计算序列总和值)、prod(X)(计算序列连乘值)、cumsum(X)(计算序列累计总合值)、cumprod(X)(计算序列累计连乘值)。
>> X = 1:10

X =

     1     2     3     4     5     6     7     8     9    10

>> sum(X)

ans =

    55

>> cumsum(X)

ans =

     1     3     6    10    15    21    28    36    45    55

>> prod(X)

ans =

     3628800

>> cumprod(X)

ans =

           1           2           6          24         120         720        5040       40320      362880     3628800

(3).其他常用函数。
mode(a, b):求模运算
sign(x):符号函数
rem(x, y):求余运算
diff(X):求序列差分
sort(X):排序
fft(X):离散傅里叶变换
rank(X):求矩阵的秩

erf(x):误差函数

2.2关系运算符

关系运算符即数值大小关系,返回值为1(比较结果为真)或0(比较结果为假)。

2.3逻辑运算符

逻辑运算符包括与&、或|、非~(不是!)。

2.4运算优先级

在一个MATLAB的表达式中,算术运算符优先级最高,其次是关系运算符,最后是逻辑运算符。其实不必刻意去记,必要时加括号即可。



版权声明:本文为u011426236原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。