第三章 数组和向量

第三章 数组和向量

  • MATLAB数组
    • 创建数组
    • 数组操作
      • 数组算术操作
      • 数组逻辑运算
      • 库函数
      • 数组连接
      • ==数组重排==
      • 线性化数组
  • MATLAB向量
  • 习题

MATLAB的一个重要功能及其特色即向量和矩阵运算。在MATLAB中向量和矩阵主要由数组表示,数组是MATLAB的核心数据结构。本章重点介绍数组及数组的运算。

MATLAB数组

数组是MATLAB中的基本构件,数组中的单个数据项称为元素。任何变量在MATLAB中都是以数组形式存储和运算的。

按照数组元素个数和排列方式分类

(1)没有元素的空数组(empty array)
(2)只有一个元素的标量,实际上是一行一列的数组。
(3)行向量(row vector)或列向量(column vector)
(4)一般的二维数组
(5)多维数组,具有行、列、页等多个维度

对于N维数组A中的元素,它的位置由一个包含N个索引值得向量给定。
MATLAB中可以使用size函数返回一个N维数组的大小,返回值是一个向量,而length函数则返回数组的最大维度,范围值是一个int整数。

例子:

clear all;clc;
A(:,:,1) = magic(4);  % 第一页
A(:,:,2) = ones(4); % 第二页
A(:,:,3) = zeros(4); % 第三页
A

%%
size(A)  % A的形状

length(A)  % A的最大维度

创建数组

实际上,之前的例子中我们已经了解了创建MATLAB数组的方法:直接输入或者内置函数。
再次强调,数组中用逗号或者空格表示同一行数据的间隔(列),用分号表示行的分隔,用冒号表示从某行到某行。

例子

clear all; clc;

A = [2 5 7; 1, 3, 42];  % 注意空格,逗号和分号

x = zeros(3, 2);

y = ones(3, 4);

%%
z = [x y]  % 两个行相等的数组合并用空格或者逗号

%%
z2 = [A; y(:, 1:3)]  % 两个列相等的数组合并用分号

%%
z3 = z2'  % 矩阵的转置 -- 共轭转置的区别

%%
r1 = rand(size(z3))  % 生成与z3数组相同形状的随机数组

%%
diag(r1)

%% 
diag(diag(r1))

函数zeros(m,n)与ones(m,n)分别产生填充值为0或1的m行n列的数组。函数rand(m,n)与randn(m,n)分别产生取值为0~1之间的随机数的数组。函数diag()具有多种形式,最常用的是diag(A),其中A为一数组,它将A的对角线上的元素作为向量返回;diag(V),其中V为一向量,它返回一个对角线为V的方阵。

MATLAB还提供了magic(m)函数,它产生一个填充1到m2之间数字的数组,其组织方式使得每一行、每一列以及对角线上的元素分别加起来等于相同的数。

数组操作

数组算术操作

加减乘除乘方和元素的加减乘除。详见例子。
例子:略

数组逻辑运算

MATLAB对数组的逻辑操作可以分为:数组对数组,数组对标量。
数组对数组要求两个数组尺寸相同即具有相同的维度,然后对应元素做逻辑比较。
数组对标量则是数组中的每个元素与标量做比较。
两种运算均返回与数组相同维度的布尔数组。

例子:

clear all; clc;

A = magic(3);
B = rand(3) * 10;
%%
R1 = A >= 4;
R1
%%
R2 = A >= B;
R2
%%
R3 = A >= rand(3, 1)*10;
R3

库函数

重点掌握sum,mean,min,max等函数;sum和mean应用在二维数组时,返回一个行向量,分别包含数组中每一列的和与平均值。而min和max则返回两个行向量,分别包含每一列的最小值与最大值以及其在每一列中的行号。
例子:

clear all; clc;

A = rand(4, 6);
A
%%
% 和
sum(A)
% 平均值
mean(A)

%%
% 整个矩阵的和与均值
sum(sum(A))

mean(mean(A))

%% 
% 最小值与最大值
[values, rows] = min(A)
% 整个数组的最小值
[value, row] = min(values)

%%
% 如果想知道数组A每行的和、均值、最大最小值?

数组连接

这部分内容之前已经讲过了。
水平方向连接,每一分量具有相同的行数,列可以不同
A = [B C D E F ... N]
垂直方向连接,每一分量具有相同的列数,行可以不同
A = [B; C; D; E; F; ...; N]

数组重排

很多时候对数组采用一种维数形式,并将其重排为另一种形式时非常有用的。在MATLAB中的reshape()函数可以实现该功能。
该函数的用法是reshape(A, rows, cols, …),其中A即为需要重排的数组,rows, cols,…等参数表示想要得到的数组的维数,可以是多维。但是需要注意,原始数组A和新数组的总数据量必须相等,或者说A的维数的乘积必须与新数组的乘积相等

例子:

A = 1:10;

% 
reshape(A , 4, 3)

A = [A 0 0];
reshape(A , 4, 3)

MATLAB对数组重排时数据的顺序是怎么样决定的呢?

MATLAB中多维数组的存储顺序

一维数组,行向量和列向量均是按顺序排列的。


二维数组:按照列来排,从第一列第一行为第一个元素,第一列第二行为第二个元素,一直到最后一列最后一行。因此,如果我们也可以用单个索引值来索引二维数组的元素,只要知道它是第几个数据

多维数组A[i, j, k, …]:同样是按列来排序,先存放第i列的数据,再存放第j列的数据,再依次类推。

下面我们来看一下三维数组的重排之后的结果。

例子:

clear all; clc;

A = rand(3, 4, 2);
A

B = reshape(4, 2, 3);
B

%%
A(12)

B(12)

线性化数组

现在我们知道在MATLAB中数组并不是按照表面上看起来的一行一列的存储,而是按照列的顺序按个存储的。当然在计算机中也只能这样存储。现在我们再来看一个例子。

clear all; clc;

% 首先,创建一个随机三维数组
A = rand(3) * 10;
A

% 判断其中大于5的元素
B = A >  5;
B

% 那现在如果我们想要将A中大于5的元素统统变为0怎么操作呢?
% 对于这种条件查询,可以使用find()函数
ix = find(A > 5);
A(ix) = 0;
A

% 现在我们来关心一下find(A>5)的返回值
ix

在MATLAB中应当尽量避免将数组的这种线性化性质作为程序逻辑的一部分,它将使程序变得不够灵活,而且阅读理解起来很难,更何况我们往往有更好的解决方案

MATLAB向量

如前所述,向量是一维数组,因此具有数组的所有性质。
下面来看看MATLAB中专属于向量的一些操作。
1.使用linespace()创建向量

c = linespace(0, 20, 11); % 第一个参数为下限,第二个参数为上限,第三个参数为长度。

zeros(1, 10);
ones(1, 10);
rand(1, 10);
randn(1, 10); % 注意rand和randn函数的区别

2. 向量的尺寸——length()函数
向量在其中一个维度的长度恒等于1,因此只需要一个值来确定向量的维度,就是向量的长度。MATLAB使用length(V)函数来返回向量的长度。若V是一个数组,则返回最长的那一维的长度。size(V)返回向量的尺寸,同数组

3. 向量索引
MATLAB中数组的索引不能小于1
向超出向量范围的位置写入数值时,会填充中间的位置,例:

v = [1, 2, 3, 4];
v(8) = 8; % 向索引值为8的位置插入数值8,
disp(v)

逻辑索引
例子

mask = [true, false, false, true];
A = [2, 3, 4, 5, 6, 7];
disp(A(mask))

%%
B = [2, 3, 4]
disp(B(mask))

当用逻辑向量进行索引时,结果中将包含原向量中对应索引逻辑向量中取值为真的元素;但是逻辑索引的向量长度必须小于等于原向量的长度。

4. 缩短向量——移除元素

A(4) = [];

5. 向量的算术操作——点的使用
体会以下命令

a = [1, 2, 3, 4, 5];
a+5

a .* 2

b = [1, 2, 3, 4, 5];
a .* b

a * b

a * b'

c = [1, 2, 3];
a .* c

点乘、点除等表示对向量相应位置的元素执行普通的算术乘法和除法。乘和除则是矩阵运算。

逻辑操作则与矩阵相同。

库函数中体会sum.mean.min.max等函数在向量和数组中返回值的区别。

向量的连接和切片则和数组完全一样。

完成习题2,3。

习题

你可能感兴趣的:(MATLAB应用讲义,matlab,线性代数)