上一节我们知道, 向量可以视为矩阵的一个特例: 若一个矩阵的行数为 1,则它可以视为 一个行向量;若列数为 1,则可以视为列向量;如果行数和列数同时为 1,那么它就是一个标 量(又称为常量、常数)。
学过其他编程语言的同学应该听过数组这个概念, 在程序设计中, 为了处理方便, 我们需 要把具有相同类型的若干元素按有序的形式组织起来, 这些有序排列的同类型数据元素的集合 就被称为数组。
学过其他编程语言的同学应该听过数组这个概念, 在程序设计中, 为了处理方便, 我们需 要把具有相同类型的若干元素按有序的形式组织起来, 这些有序排列的同类型数据元素的集合 就被称为数组。
在 MATLAB 的官方文档中,有时候也会出现数组这个概念。在 MATLAB 里,向量可以 被称为一维数组,而我们常见到的由多行多列构成的矩阵可以被称为二维数组, 这两个维度由矩阵的行和列表示。在 MATLAB  中, 一维数组可以视为二维数组的一个特例。另外,在 MATLAB  中,我们还可以定义多维数组,多维数组是指具有两个以上维度的数组,绝大多数 情况下我们不会用到,有兴趣的同学可以查看官方帮助文档。
以后在不引起误会的情况下,我们将 MATLAB 中的矩阵和数组视为同一个概念。

3.2.1 向量的创建方法

在 MATLAB  中,向量的创建方法主要有三种,分别是:直接输入法、冒号法和利用 MATLAB 的函数创建。大家可以打开本节的配套代码:“code  3  2   1”进行学习, 下面我们来 进行介绍:

1)直接输入法

向量元素需要用英文的中括号“[ ] ”括起来,元素之间用空格、逗号、分号或按回车键 分隔, 就可以创建对应的向量。若元素之间用空格、逗号分隔,则创建的是行向量;若用分号、 回车键分隔,则创建的是列向量。 (注意:这里的逗号和分号都是英文输入法下输入的,不能 用中文的逗号或分号)
举例: a = [1 3 5]和 a = [1,3,5]都可以创建包含元素 1,3,5 的行向量,并将这个行向量的值 赋值给 a ;而 b = [1;3;5]创建的是包含元素 1,3,5 的列向量。

2)冒号法:最常用

我们可以利用命令: A:step:B 来创建一个行向量。(冒号也要是英文的!)
其中, A 是起始值, step 是每次递增或递减的步长, B 是终止值(不一定刚好停在这里)。 若 step 等于 1,则可以直接简写成 A:B
直接看上面的概念不够直观,下面我们举几个例子,大家根据例子来理解会很轻松。
代码
 结果和相应的解释
1:2:7
[1 3 5 7]        % 每次增加 2,直到最后到了 7
1:2:8
[1 3 5 7]      % 每次增加 2,到了 7 后, 如果再增加 2 的话结果等于 9, 比 8 要大,所以到了 7 就停止了。
1:2:9
[1 3 5 7 9]
2:3:18
[2 5 8 11 14 17]
0:0.1:1
[0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1]    % 每次增加 0.1
0:0.01:1
[0 0.01 0.02 0.03 …… 0.98 0.99 1]         % 每次增加 0.01
1:1:100 或简写成 1:100
[1 2 3 4 5 6 7 8 …… 98 99 100]     % 步长为 1 时可以省略
1:10:3
1    % 从 1 开始,增加 10等于 11,比 3 还要大, 所以返回 1
5:2:1
空的 1×0 double  行向量    % 若 A > B 且步长 step > 0,则会返回空的向量。
10:- 1:6
[10 9 8 7 6]    % 步长为-1, 因此会从 10 开始递减
10:-2:5
[10 8 6]    % 步长为-2,从 10 开始递减, 到了 6 后, 如果再减去 2就等 于 4,比 5 还要小, 所以到了 6 就停止了。
10:- 100:5
10     % 步长为 -100,因为 10-100 = -90 比 5 还要小,  所以返回 10
10:-10:50
空的 1×0 double  行向量  % 若 A < B 且步长 step < 0,则会返回空的向量。
1:0:2
 空的 1×0 double  行向量  % 若 step = 0,则返回空的向量。
大家根据上面的例子应该很容易发现规律。下面再给大家补充两个知识点:
第一:上表中,有三种情况都会导致 MATLAB 返回空的向量:空的 1×0 double 行向量。 怎么理解这个返回结果呢?这个“1×0”指的是向量的维度,你可以理解为 1 行 0 列,即这个 向量是空的,不存在元素。 在 MATLAB 中,我们可以直接使用命令[ ]创建空的向量
第二: MATLAB 返回空的向量时,出现了一个英文单词: double。这里的 double 表示双 精度浮点型, 我在这门课中并没有特意去介绍数值的类型, 原因是这一块的知识比较底层, 涉 及到数值在计算机中的存储方式。同时, 和 C 、C++ 、JAVA 等语言相比, MATLAB 是偏应用 的一门语言,其对数值类型的要求较弱。对数值类型感兴趣的同学可以先在 b 站学习C 语言的公开课,然后再从 MATLAB 官网搜索数值类型的帮助文档进行学习。

3)利用 MATLAB 函数创建

我们主要介绍两个函数: linspace 和 logspace,它们分别用来创建等差数列和等比数列。
首先介绍 linspace 函数,它有两种用法, 区别在于是否给定第三个输入参数 n ,如果我们 不指定 n ,则 MATLAB 会默认 n=100。这个函数使用的频率也很高,大家需要掌握。
. linspace(a,b): 该命令用来创建一个行向量, 向量中的第一个元素为a,最后一个元素为b,形成总数为 100 个元素的线性间隔的向量。
. linspace (a,b,n): 该命令用来创建一个行向量,向量中的第一个元素为a,最后一 个元素为b,形成总数为 n 个元素的线性间隔的向量。
代码         
结果和相应的解释
linspace(1,100,10)
[1 12 23 34 45 56 67 78 89 100]      % 第一个数为 1,最后一个数为 100,整 个向量构成了一个等差数列,由 10 个元素组成
linspace(1,99,10)
[1 11.8889 22.7778 33.6667 44.5556 55.4444 66.3333 77.2222 88.1111 99] % 第一个数为 1,最后一个数为 99,整个向量由 10 个元素组成,构成了一个等 差数列,MATLAB 会自动计算等差数列的步长。
linspace(0,2*pi,10)
[0 0.69813 1.3963 2.0944 2.7925 3.4907 4.1888 4.8869 5.5851 6.2832] % 第一个数为 0,最后一个数为 2*pi,注意中间的乘号千万不能省略!
linspace(1,10)
[1 1.0909 1.1818 1.2727 1.3636    ……    9.8182 9.9091 10] % 如果不指定第三个输入参数 n,则默认生成 100个元素的等差数列
linspace(100,1,10)
[100 89 78 67 56 45 34 23 12 1]    % 如果 a>b,则步长是负数
初学者可能搞不懂 linspace (a,b,n)和冒号法 a:step:b 生成向量的区别,我这里为大家总结:
(1) linspace 不需要指定步长, MATLAB 会根据你给定的元素个数 n  自动计算出来; 而使用冒号法可以自己指定步长。
(2) linspace 生成的向量的最后一个元素一定是 b,而使用冒号法 a:step:b 生成的向量的 最后元素不一定是 b。
(3) 后续章节讲解循环语句时,冒号法使用的频率最高;而在绘制函数图形时,使用 linspace 得到的 x 轴的范围要比冒号法稍微准确一点。例如:我们要绘制 sin(x)在 区间[0,  2π]上的图形, x 的范围是 0 到2π, 我们使用 linspace(0,2*pi)生成的向量的 最后一个元素一定是2π;如果使用冒号法令 x=0:0.1:2*pi,那么 x 向量的最后一个 元素和2π有一个微小的差异,当然,如果我们将 step 取得更小,例如取成 0.01 , 那么这个差异几乎可以忽略。
另一个函数是 logspace 函数,它使用的频率不高,大家了解即可。它有两种常见的用法:
. logspace(a,b):创建一个行向量, 其第一个元素为10^a ,最后一个元素为10^b ,形成 总数为 50 个元素的等比数列向量。
. logspace(a,b,n): 创建一个行向量,其第一个元素为10^a ,最后一个元素为10^b ,形
成总数为 n 个元素的等比数列向量。
下面我们来看几个例子:
代码
结果和相应的解释
logspace(1,2,10)
[10 12.915 16.681 21.544 27.826 35.938 46.416 59.948 77.426 100] % 第一个数为 10^1,最后一个数为 10^2,  10 个元素组成的等比数列
logspace(2,1,5)
[100 56.234 31.623 17.783 10] % 第一个数为 10^2,最后一个数为 10^1,5 个元素组成的等比数列
logspace(log10(2),log10(1024),10)
[2 4 8 16 32 64 128 256 512 1024] % 第一个数为 2,最后一个数为 1024,10 个元素组成的等比数列
大家可以思考:如何创建一个包含 n 个元素的等比数列,其第一项为 a ,最后一项为 b。 (这里 n 、a 和 b 都是正数)?这个问题留作本章的课后习题。logsapce(log10(a),log10(b),n)

3.2.2 向量元素的引用

对向量元素的引用(即提取向量指定位置的值) 有两种情形, 分别是提取向量中的单个元 素和提取向量中的多个元素。在正式讲解之前,我们先来介绍索引(或下标)的概念。
我们知道, 向量分为行向量和列向量, 它们在 MATLAB 中只有一个维度, 因此我们可以 利用向量中包含的元素个数来描述一个向量的大小。在 MATLAB 中,可以使用 length 函数或 numel 函数来计算向量中包含的元素个数。
例如: a = [1,3,8,9,7]; length(a)或 numel(a)的返回结果是 5,因为向量 a 中有五个元素。
假如我们有一个行向量 a ,里面包含了 n 个元素(n 是大于等于 1 的常数),它们分别是 a1, a2, … , an ,那么我们可以列一个表格:
向量的元素
a1
a2
a3
an − 1
an
索引(下标)
1
2
3
n − 1
n
从上表可以看出, 索引就是指某一个元素在向量中对应的位置, 也可以称为元素在向量中 所处的下标,在 MATLAB 中,向量的索引是从 1 开始的。
举个具体的例子,假设向量 a=[2 4 8 16 32 64 128 256 512 1024],那么 a 中有 10 个元素, 因此 a 的最大索引是 10。

1)单个元素引用

我们提取向量 a 中单个元素的方法很简单,只需要利用 a(ind)命令,小括号中的 ind 就是 你要提取的对应元素的索引。(注意: 创建向量用中括号, 提取元素要用小括号哦!)
例如: a(1)的结果为 2,因为 a 中第 1 个位置(索引或下标等于 1)的元素是 2;类似的, a(9)等于 512,因为 a 中第 9 个位置的元素是 512。
有些同学可能会好奇,如果我取索引为 11,即输入 a(11)会出现什么情况?
MATLAB 会报错:“索引超出数组元素的数目(10)”,即告诉我们, 现在这个向量中元素的 数目只有 10 个,即最大索引是 10,而你取了索引 11 的元素,超出了取值范围。
另外, 如果我们将 ind 取成 0、负数或者小数, 例如输入 a(0) 、a(- 1)、a(1.5),MATLAB 也 会报错:“数组索引必须为正整数或逻辑值”。这里出现了“逻辑值”的概念, 我们在本章后面 小节中会介绍。

2)多个元素引用

类似的,我们也可以利用向量的索引来同时提取多个位置的元素,这时候只需要将 ind 设 置成一个向量,ind 中放入我们想要提取的元素的索引,然后使用 a(ind)命令即可。
例如,我们令 ind = [1 3 5 7 9],那么 a(ind)的结果为[2 8 32 128 512],即我们提取了向量 a 中奇数位置的元素。熟悉向量冒号创建方法的同学应该能够看出, ind 等于 1:2:9,因此我们可 以直接将 a(ind)写成 a(1:2:9),这就表示提取 a 中奇数位置的元素; 类似的, 提取 a 中偶数位置 元素的命令是 a(2:2:10),如果你不熟练的话,可以分成两步写,即先令 ind=2:2:10,然后再使 用 a(ind)的命令。当然,对于同一个位置的元素,我们也可以提取多次,例如: ind = [1 2 2 3 3 3],那么 a(ind)得到的结果应该是[2 4 4 8 8 8],以后熟悉的话可以直接写成 a([1 2 2 3 3 3])。
💡
技巧: 使用 end 索引 有同学会想, 假如我不知道向量 a 中有多少个元素, 也不想使用 length 函数或者 numel 函 数来计算向量中元素的个数, 那我能不能提取出 a 中奇数位置的元素呢?这时候就需要用到一 个特殊的关键字: end。它有很多种用法,在这里 end 可以用来替代向量的最后一个索引。 例如,我现在要访问 a 中第五个至最后一个元素,那么我们可以直接使用 a(5:end),这里 的 end 就表示了 a 的最后一个索引; 另外, 我们还可以对 end 进行计算, 例如要访问 a 中第五 个至倒数第三个元素,我们可以使用 a(5:end-2),得到的结果为[32 64 128 256]。 这里有一个易错点, 如果使用了 end,不能将要取元素的索引赋值给 ind。例如, 还是要访 问 a 中第五个至最后一个元素, 如果你令 ind=5:end ,MATLAB 就会报错。因此, 我们只能在 a 后面的小括号中使用 end 来替代数组的最后一个索引。 那我们回到上面的问题, 在不知道 a 中有多少个元素的前提下, 我们可以使用 a(1:2:end)。
最后请大家思考:如何将一个向量倒序?例如原来的向量是[1 5 8 4],倒序后是[4 8 5 1]。 这个问题留作本章课后习题。

3.2.3 向量元素的修改和删除

前面我们介绍了向量元素的引用, 我们可以利用等号赋值的方法对引用位置的元素进行修 改和删除。令向量 a=[2 4 8 16 32 64 128 256 512 1024],请大家依次执行下面的代码:
请依次执行下面的代码                    修改后的向量 a
a(1) = 4    % 第一个元素改成 4
[4 4 8 16 32 64 128 256 512 1024]
a([1,3]) = [50 60] % 第 1 个位置元素改成 50;第 3 个位置元素改成 60
[50 4 60 16 32 64 128 256 512 1024]
a(1:3) = [5 6] % 赋值时,左右两侧的元素个数要相同,左边引用了 3个位置, 右侧的向量长度为 2
MATLAB 报错: 无法执行赋值,因为左侧和右侧的 元素数目不同。
a(2:4) = 100    % 如果右边为常数, 则将指定位置的元素全部变成这个常数。
%  第 2 至 4 号位置的元素改为了 100 [50 100 100 100 32 64 128 256 512 1024]
a(13) = 88    % 把索引为 13 的元素赋值为 88,如果超过了最大索引,则会自动拓展向量的大小
[2 4 8 16 32 64 128 256 512 1024 0 0 88] %  索引 11 和 12 的位置会自动用 0 进行赋值
如果我们将等号右侧变成空向量[ ],则表示删除对应位置的元素。
a(1) = [ ]    % 删除 a 的第一个元素
[100 100 100 32 64 128 256 512 1024]
a(end-1:end) = [ ]    % 删除 a 中最后两个元素
[100 100 100 32 64 128 256]

思考题:
 a=[2 4 8 16 32 64 128 256 512 1024]
a([1,3]) :a中索引为1和3的元素
a(1:3) :a中索引为1到3的元素
a(1,3) :a中第一行第3列的元素

Loading...
公告
🎉大学生科技协会(2024)网站试运行🎉
-- 感谢您的支持 --- 科协获:
小平科技创新团队 (青少年科技创新领域国家级最高荣誉,全校唯一)
全国高校百强社团 中国大学生ican物联网创新创业实践教育基地 校十佳社团 “一院一品”智能空间 科技竞赛优秀组织单位
阅读科协简介了解更多吧!