9 Matlab 矩阵

在第一次介绍 Matlab 的时候就说过 Matlab 这个名字的由来,显然,它的主打优势就是矩阵操作。很多同学的线性代数基础不太扎实,一听矩阵就头皮发麻。我们在这里只关心矩阵这样一种特殊的数据存储形态,它本身的数学意义,不做探讨。

为了简化起见,我们在这里把矩阵看作是一个 NM 列的一种有序结构。你可以想象一下阅兵式上的那些兵哥哥们排成的方队。兵哥哥的整个方队,你可以看作是一个矩阵,方队中的每一个兵哥哥,是矩阵中的元素

是不是帅你一脸?(来源见水印)

Matlab 为了将矩阵与其他数据类型区分开来,用[]把矩阵中的元素括起来。所以,也可以这么说,用[]括起来的东西,都是矩阵。

这里的 NM 可以取任意值,有同学可能也觉得比较困惑,NM 取 0 时,有什么意义,又有什么用?这是一个空矩阵,它就是一个矩阵,只是里面没有元素。实验一下:

>> a = ones(0)
a =
    []

大家help一下ones就明白上面这个命令的意思了。

在程序设计中经常先创建一个空矩阵,再将运算过程中得到的结果往这个空矩阵里面塞。

矩阵同一行的元素之间用空格或逗号,分隔,行与行之间用分号;分隔。看一个例子:

>> a = [1, 2, 3, 4, 5; 6, 7, 8, 9, 10]
a = 
    1  2  3  4  5 
    6  7  8  9  10

前面我们也说过矩阵可以存储几乎所有的数据类型,比如元素是矩阵的矩阵,不同数据类型的元素混在一起的矩阵等等。另外,一个字符串其实也是一个矩阵,有兴趣的同学可以自己查阅相关的资料。

矩阵操作

1 创建矩阵

最直接的方法当然是逐个写出矩阵中的元素。有些特殊的矩阵可以使用Matlab提供的函数直接创建。例如:

>> ones (3, 4)
ans = 
    1  1  1  1
    1  1  1  1
    1  1  1  1
>> zeros (2)
ans = 
    0  0
    0  0
>> a = [1, 2, 3]
a = 
    1  2  3
>> b = [1; 2; 3]
b =
    1
    2
    3
>> rand(2)
ans = 
    0.8147    0.1270
    0.9058    0.9134    

ones, zeros, rand这几个函数的功能,大家自己help一下就能了解了。

2 引用矩阵元素

直接看例子:

>> a = [1, 3, 5, 7; 9, 11, 13, 15; 17, 19, 21, 23]
a = 
    1   3   5   7
    9  11  13  15
    17  19  21  23
>> a (2, 4) 
ans = 
    15

这就好比你不知道这家伙的名字,但是你知道他排在方队第二行第四列,所以你喊“第二行,第四列的那个家伙,你妈妈喊你回家吃饭了”,这就是引用矩阵元素最直接的方法。上例就是取第二行第四列的元素

注意,这里的第二行第四列,数字“2”与“4”,也称索引(index),要用()括起来,不要与矩阵的[]弄混。行索引与列索引用,分隔。

取第三行第二到第四列的所有元素

>> a(3, 2: 4)
ans = 
    11 13 15

又出现了一个新符号:,它的完整用法是start: step: end,意思就是从起点每隔一个步长到终点。

不指定 start 与 end 的值的话,就默认取指定范围内的头与尾。在这个三行四列的矩阵中,对于行来说,start默认值为1,end的默认值为3。

不指定step值的话就取默认值1。

本例中,3的意思是第三行,2: 4的意思是从2到4,步长为1,也即第2、3、4三列。

:的使用比较多,经常用于循环,也常常用于创建矩阵。例如,我们创建一个矩阵,矩阵中元素是1到16中的所有奇数。可以这样写:

>> b = [1:2:16]
b = 
    1  3  5  7  9  11  13  15

取第2行所有列的数据

>> a(2, :)
ans = 
    9 11 13 15    

取第3列所有行的数据

>> a(:,3)
ans = 
    5
    13
    21

请结合例子,仔细体会:的用法。

取最后一行,例数第二列的数据

>> a(end, end-1)
ans  = 
     21

有时候,我们不知道也不想知道矩阵的大小,只想取它的最后行的数据,可以使用end关键字。显然,end是最后一列,那end-1就是倒数第二列。

特别地,对于只有一行(行向量)或只有一列(列向量)的矩阵来说,可以直接使用a(n)这样的形式来获得第n个元素,大家可以自己试一下。

顺便插播一个东西:行向量与列向量可以通过'操作符相互转化:

>> [1,2,3]'
ans = 
    1
    2
    3
>> [1;2;3]'
ans = 
    1 2 3

对于引用矩阵元素的操作,还有一个比较灵活的用法:结合逻辑表达式进行逻辑索引

假设有矩阵r如下

>> r = rand(5)
r =
    0.6324    0.9649    0.8003    0.9595    0.6787
    0.0975    0.1576    0.1419    0.6557    0.7577
    0.2785    0.9706    0.4218    0.0357    0.7431
    0.5469    0.9572    0.9157    0.8491    0.3922
    0.9575    0.4854    0.7922    0.9340    0.6555

取矩阵r中所有大于0.5的值:

>> r1 = r(r > 0.5)
r1 =
    0.6324
    0.5469
    0.9575
    0.9649
    0.9706
    0.9572
    0.8003
    0.9157
    0.7922
    0.9595
    0.6557
    0.8491
    0.9340
    0.6787
    0.7577
    0.7431
    0.6555

为了搞清楚这个命令到底做了什么工作,我们先看看r > 0.5是什么。

>> r > 0.5
ans =
  5×5 logical 数组
   1   1   1   1   1
   0   0   0   1   1
   0   1   0   0   1
   1   1   1   1   0
   1   0   1   1   1

这样一来,我们就很容易看出r1 = r(r > 0.5)是分两步走的:先通过r > 0.5获得了每个元素是否满足条件的逻辑值(逻辑数组)。r1 = r(r > 0.5)将每个符合条件的元素提取出来并赋值给r1

逻辑数组有很多灵活的用法。比如,假设有一个逻辑数组logi(通过logical函数转换得到)以及另外一个数组x如下:

>> logi = logical ( [1,0,1;0,0,1;1,0,0])
logi =
  3×3 logical 数组
   1   0   1
   0   0   1
   1   0   0
>> x = [1,2,3;5,6,7;4,8,9]
x =
     1     2     3
     5     6     7
     4     8     9

我们看看x(logi)的输出是什么

>> x(logi)
ans =
     1
     4
     3
     7

它把x矩阵中对应于logi矩阵中元素值为true位置的元素输出为结果。
改变矩阵元素的值

这个比较简单,想改变哪一个元素的值,就把这个值先索引出来,然后直接用赋值操作就可以了。举例如下:

>> a(2,3) = 0
a = 
     1     3     5     7
     9    11     0    15
     17    19    21    23

也可以采用逻辑索引的方式进行批量操作:

>> x = rand(4)
x =
    0.1712    0.0462    0.3171    0.3816
    0.7060    0.0971    0.9502    0.7655
    0.0318    0.8235    0.0344    0.7952
    0.2769    0.6948    0.4387    0.1869
>> x(x > 0.5) = 1
x =
    0.1712    0.0462    0.3171    0.3816
    1.0000    0.0971    1.0000    1.0000
    0.0318    1.0000    0.0344    1.0000
    0.2769    1.0000    0.4387    0.1869

删除矩阵的行或列

矩阵的“矩”是“方”的意思,所以矩阵的构成上有一个特殊的要求,行与行或者列与列的元素个数要相等。所以对于一个矩阵的删除与增加元素操作来讲,只能增加或删除完整的一行或一列。删除操作一般使用赋空矩阵来完成。

例如,删除第二行

>> a(2, :) = []
a = 
  1   3   5   7
  17  19  21  23

增加矩阵行或列
这种操作在 Matlab 中也被称为矩阵连接。举例说明:

>> a = [1:2:7; 17:2:23]
a = 
  1   3   5   7
  17  19  21  23
>> b = [2:2:8]
b = 
  2 4 6 8
>> d = [2;4]
d = 
  2
  4
>> [a, d]
ans =
     1     3     5     7     2
    17    19    21    23     4
>> con =  [a;b]
con =
     1     3     5     7
    17    19    21    23
     2     4     6     8
>> con = [con(1,:); b; con(2:end, :)]
con =
     1     3     5     7
     2     4     6     8
    17    19    21    23
     2     4     6     8

肯定有很多小伙伴要晕了。

先说[a,d],看变量a与变量d之间,用的是,,记得我们前面说过行内元素之间用,分隔,行与行之间用;分隔。所以这里的意思就是把矩阵a与矩阵d在行上“连接”。

我们分别写一下矩阵a与矩阵d,观察下这个“连接”。

      1   3   5   7    |  2  
      17  19  21  23   |  4  

竖线左边的是矩阵a,竖线右边的是矩阵d,再结合输出结果,应该明白怎么回事了吧。[a; b]也是类似的,只不过是变成了增加行。

如果你试一下[a,b]或者[a;d],你会发现输出错误。想一想,为什么会出现这样的情况?

那如果不是在行末或列末添加,而是要在中间某行之后插入新的一行怎么做?最后一个命令做的就是这件事情。

[con(1,:); b; con(2:end, :)]在这个[]里面,;分隔了三个部分。

con(1,:)是矩阵con中的第一行,通过;将矩阵b增加到第一行之后,接着又将矩阵con剩下的行增加进去便完成了整个插入行的操作。

插入列也是类似的操作,不再赘述。

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

推荐阅读更多精彩内容

  • 1. 矩阵的特征值分解 矩阵的特征值分解是非常重要的数学工具。在matlab中一般使用eig()函数完成矩阵特征值...
    秦旻阅读 11,265评论 1 1
  • 其实是早应该想到的,今天写程序的时候想到了。然后,跟同学说起来,说,原来国外的教材很多都是矩阵的形式来表示离散傅里...
    大飞哥阅读 1,889评论 0 0
  • 1. 问题描述 MATLAB的计算结果往往为矩阵(向量)的形式,后续的处理中需要导出txt、Excel文件进行后处...
    马骋阅读 10,340评论 0 2
  • 显示中文帮助的方法 预设→常规→帮助→在mathworks.com网站上(需要Internet连接)→语言(简体中...
    VeyronC阅读 2,449评论 0 34
  • 烽火狼烟弓上弦,流言惑众谁敢言。 仓皇反复军心散,冥昭瞢闇无所断。 2016-06-08 DD/More 发于 公...
    ACG风景阅读 335评论 0 51