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也会提示正确的名字)。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容

  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,772评论 6 96
  • 显示中文帮助的方法 预设→常规→帮助→在mathworks.com网站上(需要Internet连接)→语言(简体中...
    VeyronC阅读 2,463评论 0 34
  • MATLAB基本数据类型 双精度/单精度/整形 数据的范围 务必注意溢出的问题。 函数 类型检查 class is...
    hainingwyx阅读 5,668评论 0 6
  • NumPy是Python中关于科学计算的一个类库,在这里简单介绍一下。 来源:https://docs.scipy...
    灰太狼_black阅读 1,228评论 0 5
  • 清晨,月亮隐去 一具美好的,柔软的肉体 从水里升起 眼睛在水里洗了一遍 乳房在水里洗了一遍 昏黄的窗帘掩住出口 情...
    f3494c632b49阅读 1,240评论 69 62