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):误差函数
erf(x):误差函数
2.2关系运算符
关系运算符即数值大小关系,返回值为1(比较结果为真)或0(比较结果为假)。
2.3逻辑运算符
逻辑运算符包括与&、或|、非~(不是!)。
2.4运算优先级
在一个MATLAB的表达式中,算术运算符优先级最高,其次是关系运算符,最后是逻辑运算符。其实不必刻意去记,必要时加括号即可。
版权声明:本文为u011426236原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。