因课题需要,根据书籍初步自学matlab,结合刷教程书的一点心得,做一个简单记录,方便自己能形成一个输入输出循坏,加深理解和记忆。
参考书籍:Matlab揭秘,David McMahon著,郑碧波译.
二、Matlab中最基本的向量与矩阵运算知识
1、对向量的操作
1)向量的基本运算:
定义一个向量
创建一个列向量,元素与元素之间用分号(;)隔开,如 a = [2; 1; 4];
创建一个行向量,元素与元素之间用空格(space)或者逗号(,)隔开,如 b = [3, 1, 5];
向量的转置、共轭转置
向量转置可以使用(')来完成,如 b = a';
当向量元素中涉及到复数时,转置运算会自动完成共轭转置。
如果只想转置而不进行共轭处理,可以使用(.'),如 b = a.';
向量的加减运算、数乘法运算
Matlab中向量的加减运算只用参与运算的向量同型即可,数乘法的运算规则和线性代数中一致。
向量的幂方运算
在Matlab中向量的乘方必须在幂运算符( ^)前面加上句号(.),
只有这样才是对向量每一个元素进行幂运算,否则将报错。如 y = x .^2;
向量的点积与叉积(数量积与向量积)
向量的点积要通过点乘运算(.*)来完成,否则无法满足点积的定义。
同时,点积运算也可以使用dot(a, b)命令来完成。
向量的叉积则要求两个向量必须是三维的,然后使用cross命令来实现,如 c = cross(a, b);
向量的模(两种求解方法)
一是根据点积定义长度来求解,即一个向量的模的平方就等于它与自身做点积,如 a = sqrt(a .* a)。
同时要注意的是,对于复数向量的模,我们必须先求解向量的共轭向量。
如果是直接用转置符号求共轭转置,将会出错,这里应该严格使用conj命令求解共轭向量,然后再用它们做点积。
二是使用dot(a, b)来求点积,然后开根号,这样即使是复数向量,也不会出错。(推荐使用,简单明了)
2)向量的复杂运算:
由小向量合并得到大向量:
Matlab中提供了一种操作,可以允许我们把向量合并在一起创建新向量。
两个列向量合并为一个列向量,两个行向量合并为一个行向量。
如 a = [1; 4; 5]; b = [2; 3; 4]; c = [a; b]; 或m = [1, 2, 3]; n = [2, -1, 3]; k = [m, n];
创建等差元素向量
根据问题需要,我们可以创建元素间距相等的向量,语法为:x = [x0 : q : xn];
如 x = [0 : 2 : 10] = 0 2 4 6 8 10
特征化向量(一些便捷操作)
测量向量的长度(length)
求解向量元素中的最值(max、min)
向量所有元素求和(sum)
返回向量中每个元素的绝对值(abs)
引用向量元素
对于向量元素的引用,有常见的三种类型:
一是引用其中某一个元素,如 a(i) = 向量 a 的第 i 个元素;
二是引用整个向量元素,如 a(:);
三是引用其中某一段范围内元素,如 a(4:6) = 向量 a 的第 4 到第 6 个元素。
3)注意事项:
行向量与列向量的区别:行列向量的主要区别在于定义时,一个用分号,而另一个用空格或者逗号,我个人习惯行向量中元素用逗号隔开,便于和列向量一起记忆。size函数的使用方法和理解:
%总结:
%size命令是用来检查每个数组元素的个数的,我们在这里可以把检查结果存储到
%两个变量sizex和sizeN中。
%举个例子:
%x = [1, 2, 3, 4];
%sizex = size(x)
%sizex =
% 1 4
%y = [1, 2, 3, 4; 5, 6, 7, 8];
%sizey = size(y)
%sizey =
% 2 4
^ or .^,* or .* 等类似运算的区别:
对于向量运算来说,因为我们处理的通常是一行或者一列数据,
那么如果仅仅是 ^ 或 *,它的意义更像是处理单个数据,而不适合于向量或矩阵运算,
因此Matlab规定了对向量或矩阵运算时必须要使用加点运算。
即向量中用 .^ 和 .*
2、对矩阵的操作
1)矩阵的简单运算:
矩阵的建立:
矩阵的建立同向量类似,只不过是行数和列数增多。
如 A = [1, 2, 3; 4, 5, 6]就能建立一个2行3列的矩阵。
矩阵的转置、共轭转置:
严格来说,向量也是矩阵的一种,所以我们原本应当先定义矩阵的转置/共轭转置,再来定义向量的相应操作。
这里直接给出矩阵的转置如何实现:' 表示转置;.' 表示在复数出现的情况下,只进行转置,而不进行共轭操作。
矩阵的加减运算:和向量类似,当两个矩阵同型时,便可以进行加减运算。矩阵相乘与数组相乘:
当两个矩阵的行列数满足一定关系时,便可以进行矩阵相乘,如 C = A*B;
而两个矩阵按数组相乘运算时,得到的结果往往与矩阵相乘的结果不一样。
数组相乘是让两个矩阵对应位置的元素直接做乘法,得到结果拼成新矩阵,如 D = A.*B。
此外,数组相乘时两个矩阵必须完全同型,这一点不同于矩阵相乘中A的列数与B的行数匹配即可。
2)矩阵的复杂运算:
矩阵的乘方运算:
此处所说的矩阵的乘方运算,是指的对矩阵上每一个元素乘方,而不是矩阵作为一个整体乘方,
整体乘方可以使用矩阵乘法(C = A*B)来实现。
矩阵元素乘方语法为(A.^n),如:A = [2, 4; -1, 6]; A .^ 2 = [4, 16; 1, 36]
引用矩阵的元素:
类似于引用向量的元素,我们对于矩阵元素的引用也可以分为三大类:
一是引用某一个具体元素,如 A(3, 4);
二是引用某一行/列,如 A(:, i) = 第 i 列所有元素;
三是引用某一块元素,如 A(m:n, i:j) = A中第 m 到 n 行,第 i 到 j 列的所有元素组成的小元素块。
同时,通过结合赋值运算符 '=' 我们还可以改变矩阵中任意元素的值。
我们还可以通过方括号留空的形式删除矩阵的行和列,如 A(2, ;) =[]; 这便删除了A的第2行。
矩阵的一些其他运算:
在Matlab允许对矩阵做一些较为特殊的操作如:
一对矩阵中每个元素加上同一个数,如 A = [1, 2, 3, 4]; B = 2 + A = [3, 4, 5, 6];
二是对矩阵进行左除(.\)和右除(./),这时要求矩阵完全同型,对应元素之间匹配相除。
如 A = [2, 4, 6, 8]; B = [2, 2, 3, 1]; C = A .\ B = [1, 0.5, 0.5, 0.125]; D = A ./ B = [1, 2, 2, 8];
注意:矩阵的左除和右除运算便实现了线性代数中方程组求解的代码转换
常见的一些特殊矩阵:
eyes(n):nxn的单位矩阵
zeros(m, n):mxn的零矩阵
ones(m, n):mxn的全1矩阵
magic(n):n阶幻方矩阵
sparse(m, n):mxn的稀疏矩阵(后面会提到)
3)注意事项:
size函数在矩阵运算中的作用:与向量中操作类似,下给出向量段中的注释代码:
%总结:
%size命令是用来检查每个数组元素的个数的,我们在这里可以把检查结果存储到
%两个变量sizex和sizeN中。
%举个例子:
%x = [1, 2, 3, 4];
%sizex = size(x)
%sizex =
% 1 4
%y = [1, 2, 3, 4; 5, 6, 7, 8];
%sizey = size(y)
%sizey =
% 2 4
3、线性代数问题在Matlab中如何实现
1)用Matlab求矩阵的行列式、秩、逆矩阵与伪逆矩阵
求矩阵的行列式:
det(A) = A 的行列式
求矩阵的秩:
rank(A) = r = A的秩
求矩阵的逆矩阵或伪逆矩阵(亦称广义逆矩阵):
inv(A) = A的逆矩阵
pinv(A) = A的广义逆矩阵(在求解有无数解向量的线性方程组时可能会用到)
2)用Matlab解线性方程组
解法1:左除除法:
A*x = b; x = A \ b;
解法2:矩阵乘法:
A*x = b; x = inv(A) * b;
3)用Matlab简化矩阵
简化成梯形矩阵:
rref(A) = 按Gauss-Jordan消元法产生矩阵A降行后的梯形形式。
对矩阵进行LU、QR或SVD分解:
这里仅给出LU分解的语句指令如下:[L, U] = lu(A);
需要注意的是,这里是一种广义的LU分解,其得到的结果矩阵中,对角线元素不一定为1,也不一定为三角矩阵。
4)注意事项:关于向量和矩阵的运算操作,上述只是列举了一些最基本的,还有许多操作没有列出,可以查阅其他资料或者官方帮助文档,在后续文章中,也会把学习过程中碰到的向量矩阵相关操作记录下来。
|