MATLAB矩阵(一)

概述

本次内容涉及MATLAB中的矩阵,这是我们使用MATLAB处理数据的基本元素,学习本节的内容可以掌握基本的如何处理矩阵。

本次的内容几乎都可以凭借线性代数的了解来学习,代码块中的代码可以copy到MATLAB中运行,或者将一个代码块复制到一个新文件选择单步运行(step run),在该命令下每次只执行一个语句,逐个观察输出即可。部分函数的用法很多不能穷举,举出来的函数一般来说足够使用,读者在使用之前也可以先调用help 查看该函数的其他用法。

创建矩阵

在上一节中,我们认识了MATLAB的基本操作,其中一种定义变量的方法为直接赋值如:a=1,事实上,这种操作的本质上就是定义了一个最简单的1×1的矩阵(这一现象可以在workspace中观察到)。
一个矩阵的基本形式可以表达为以下形式

% 两种形式是完全等价的,但是更推荐使用第一种形式。
[1,2,3,4;-5,6,7,8] 
[1 2 3 4;-5 6 7 8]  
% 个人推荐第一种表达形式的原因:
[1,2,3,4;-5,-6,-7,8] % 正确
[1 2 3 4;-5 -6 -7 8] % 正确
[1 2 3 4;- 5 -6 -7 8] % 正确
% [1 2 3 4;- 5 - 6 -7 8] % 错误,这样的表示会让计算机误判为(-5-6)是一个变量

其中,上述矩阵为行数为2,列数为4的矩阵,一个MATLAB矩阵遵循以下原则;

  • 矩阵的元素以方括号包含;
  • 同一行不同列以逗号分隔;
  • 同一列不同行以分号分隔;
  • 每行(或者每列)必须有相同数量的元素;
  • 矩阵元素可以是数值(不区分整数,浮点数和复数)或者字符串之一。

1.直接创建

一般来说可以使用直接赋值的思路直接创建,如下所示:

% 创建一维行向量(行矩阵);
a = [1,2,3,4];
% 创建一维列向量(列矩阵);
b = [1;2;3;4];
% 创建二维矩阵;
c = [4,6,-6;2,-3,0;-9,5,7];
% 矩阵元素可以是表达式
d = [1+2,3 * 4,5];
% 矩阵可以为字符矩阵(不是字符串矩阵)
str = ['hello world']; % 单行字符矩阵
str1 = ['hello',' ','world']; % 单行字符矩阵
% str2 = ['hello'; ' ';'world'];% 报错!每一行字符数量不等长。
%矩阵的一些特殊值
e = [eps,inf,-inf,nan,pi,i,j];
% eps 绝对值最小的浮点数(机器所能表示的最小分度);
% inf 正无穷大 1/0;
% -inf 负无穷大 -1/0;
% nan(或者NaN) 无意义的数(Not a Number)0/0;
% pi 圆周率π的值
% i 虚数单位
% j 还是虚数单位(EE工程师专用版本)
% 绝对不要用以上的名字作为变量名!
% 绝对不要用以上的名字作为变量名!
% 绝对不要用以上的名字作为变量名!

事实上,这种直接赋值的方法实在过于费时费力,我们通常还会使用另一种方法:用冒号运算符创建等差数列(a:b:c)

1:2:10 % (a:b:c)中a为等差数列首项的值,b为公差,c为区间限,数列储存为行向量;
1:10 % b = 1时,b可以省略;
10:-2:1 % 公差也可以是负数;
1:-2:10 % 等差数列找不到区间限c时(或者b=0),会返回空矩阵;
2.^(1:5) % 加上指数操作就成了等比数列

2.调用函数

MATLAB的库函数中含有很多快速创建矩阵的函数,常见的有:ones,zeros,eye,rand,magic,true,false,这里逐项给出说明:
ones函数

ones(n); % 创建n×n的方阵,每个元素的值都为1;
ones(m,n); % 创建m×n的矩阵,每个元素的值都为1;
ones(k,m,n); % 创建k×m×n的三维矩阵,每个元素的值都为1;

zeros函数

zeros(n); % 创建n×n的方阵,每个元素的值都为0;
zeros(m,n); % 创建m×n的矩阵,每个元素的值都为0;
zeros(k,m,n); % 创建k×m×n的三维矩阵,每个元素的值都为0;

eye函数

eye(n); % 创建n×n的单位阵,即正对角线上的每个元素的值都为1;

rand函数

rand(n); % 创建n×n的方阵,元素的值服从区间0-1的均匀随机分布;
rand(m,n); % 创建m×n的矩阵,元素的值服从区间0-1的均匀随机分布;
rand(k,m,n); % 创建k×m×n的三维矩阵,元素的值服从区间0-1的均匀随机分布;

randn函数

% randn函数只是rand的变体,元素服从标准正态分布。
randn(n); % 创建n×n的方阵,元素的值服从标准正态分布;
randn(m,n); % 创建m×n的矩阵,元素的值服从标准正态分布;
randn(k,m,n); % 创建k×m×n的三维矩阵,元素的值服从标准正态分布;

magic函数

magic(n); % 创建n×n的方阵,该方阵满足每行每列对角线和相等;

true函数

true(n); % 创建n×n的逻辑方阵,该方阵所有元素都是true;

false函数

false(n); % 创建n×n的逻辑方阵,该方阵所有元素都是true;

这里还有另一类生成函数,能快速生成一维矩阵:linspace,logspace等。
linspace函数

linspace(x1,x2); % 直接将区间x1-x2划分为100个线性等分的点,返回间隔点向量;
linspace(x1,x2,n); % 直接将区间x1-x2划分为n个线性等分的点,返回间隔点向量;
% 这里补充一点,你可能觉得之前的基于冒号操作符(:)创建等差数列的方法也可以产生一样的结果
% 但是二者是有本质区别的。
% linspace产生的结果是必然以x2作为最后一个变量,它实现的是区间的等分,并且x1,x2都可以是复数
% 冒号操作符仅能从一端以公差检索,不能确保包含x2;此外,x1和x2都必须是实数。
% 你也可以处于好奇尝试一下:n = 1;n <= 0;n不是整数的情况,看看linspace的返回值。

logspace函数

logspace(x1,x2); % 直接将区间x1-x2划分为100个对数间隔的点,返回间隔点向量;
logspace(x1,x2,n); % 直接将区间x1-x2划分为n个对数间隔的点,返回间隔点向量;
% 感觉吧,就是linspace的兄弟函数,x1,x2都可以是复数
% 你也可以处于好奇尝试一下:n = 1;n <= 0;n不是整数的情况

运算符

比较走运的是,MATLAB中运算符的优先级和一般的数理知识并不冲突,运算符和变量不要求强制的空格,「我加空格纯粹为了美观,当然取负号时最好不要加空格」,因此只需要认识MATLAB的一些运算符,就可以比较容易的上手矩阵运算。矩阵的运算这一部分的内容与线性代数的内容一致,已经有线性代数基础的应该容易理解,没有线性代数的基础的同学建议单步执行以下命令,仔细观察结果的变化,熟悉这些运算符的作用。
运算符操作总体上分为两类:数组运算符和矩阵运算符。

1.数组运算符

数组运算符可以理解为针对矩阵元素的运算,与矩阵本身的性质无关,也是逐个的运算。

%% 数组运算符
% 测试样例
a = [2,3,-4;6,7,8] % 2*3的矩阵
b = [1,2,-1;2,1,1] % 2*3的矩阵

% 一元加运算符(+)相当于数学上的正号
+a % 相当于数学上的正号,鸡肋无疑,实际上并没有什么作用。

% 一元减运算符(-)相当于数学上的正号
-a % 相当于数学上的取负号,返回相反数。

% 二元加运算符(+)和减运算符(-)的规则与线性代数一致;
% 这一类的二元运算符存在三种情况:标量+标量,矩阵+标量,矩阵+矩阵
a + 1 % 矩阵+标量的结果,矩阵中每个值都加上该标量;
a + b % 矩阵+矩阵的结果,矩阵中每个值都加上该标量;
% a + [1,0;0,1] % 此时语句报错,矩阵+矩阵运算时,必须要求矩阵的维度匹配(行列数量一致);

% 逐元素乘运算符(.*)是逐元素操作的,也就是对应矩阵元素位置的相乘
a .* 2 % 矩阵.*标量的结果,矩阵中每个值都加上该标量;
a .* b % 两个矩阵对应位置的元素相乘,要求矩阵的维度匹配(行列数量一致);

% 逐元素乘方运算符(.^)是逐元素操作的,也就是对应矩阵元素位置的乘方
a .^ 2 % 矩阵.^标量的结果,矩阵中每个值都为对应位置元素的标量次幂;
2 .^ a % 标量.^矩阵的结果,矩阵中每个值都为以该标量为底,以对应位置元素为指数的值;
a .^ b % 两个矩阵对应位置的元素相乘,要求矩阵的维度匹配(行列数量一致);

% 逐元素右除运算符(./)是逐元素操作的,也就是对应矩阵元素位置的右除
a ./ 2 % 矩阵./标量返回一个商矩阵,矩阵元素为被除数,该标量为除数;
2 ./ a % 标量./矩阵返回一个商矩阵,该标量为被除数,矩阵元素为除数;
a ./ b % 矩阵.\矩阵返回一个商矩阵,左矩阵元素为被除数,右矩阵元素为除数
% 这时要求矩阵的维度匹配(行列数量一致);

% 逐元素左除运算符(.\)是逐元素操作的,也就是对应矩阵元素位置的左除
a .\ 2 % 矩阵.\标量返回一个商矩阵,矩阵元素为除数,该标量为被除数;
2 .\ a % 矩阵.\标量返回一个商矩阵,该标量为除数,矩阵元素为被除数;
a .\ b % 矩阵.\矩阵返回一个商矩阵,左矩阵元素为除数,右矩阵元素为被除数
% 这时要求矩阵的维度匹配(行列数量一致);

% 提醒:左除右除运算符的区别只要记住斜杠上的是分子,斜杠下的为分母即可。

% 数组转置(.'),行列交换得到转置矩阵
a.' % 返回矩阵的数组转置,相当于矩阵的行和列互换,得到新的矩阵;

2.矩阵运算符

%% 矩阵运算符
% 测试样例
a = [2,3,-4;6,7,8] % 2*3的矩阵
b = [0,1,-5,3;2,-3,5,5;-1,4,2,3] % 3*4的矩阵
c = [1;2]

% 矩阵乘法运算符(*) 矩阵相乘得到线性代数上的矩阵乘积,
a * 2 % 矩阵*标量的结果,矩阵中每个值都加上该标量;
a * b % 满足矩阵相乘的规则,要求矩阵的维度匹配(左矩阵列=右矩阵行);

% 矩阵乘方运算符(^)矩阵必须为方阵(或者标量),
[0,1;2,0] ^ 2 % 矩阵.^标量,方阵的标量次幂;
2 .* [0,1;2,0] % 标量.^矩阵基于特征值和特征向量求解,线性代数内容(个人目前还没用过);

% 矩阵左除运算符(\)矩阵左除(线性代数没有这玩意)
% 注解:线性方程组如果可以表示为A*x=B,那么解方程组时就应该在两式用A的逆阵(暂且叫做Ai)左乘,这时式子化为x=Ai*B,矩阵左除运算结果A\B=Ai*B。同理可以推演右除
a \ c % 矩阵\矩阵相当于解线性方程组a*x=c

% 矩阵右除运算符(/)矩阵右除
a \ c % 矩阵\矩阵相当于解线性方程组x*a=c

% 共轭转置('),针对与矩阵而言,行列交换并求共轭得到共轭转置矩阵
a' % 返回矩阵的共轭转置,相当于矩阵的行和列互换再求共轭,得到新的矩阵;
% 但是由于一般都是操作实数,取共轭不会有影响,平时更常用(')而不使用(.');

小结

本次的内容几乎都只要copy到MATLAB中执行即可,几乎只需要观察即可。生成函数很多不需要死记,函数名几乎可以直译,开始用几次就可以无压力记住(即使记错了某个字母,MATLAB也会提示正确的名字)。

    原文作者:毛圈
    原文地址: https://www.jianshu.com/p/2b08fd7bab37
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞