主要内容

向量化

使用向量化

MATLAB®针对涉及矩阵和向量的操作进行了优化。修改基于循环的、面向标量的代码以使用MATLAB矩阵和向量运算的过程被称为向量化.向量化代码是值得的,原因如下:

  • 外观:向量化的数学代码看起来更像教科书中的数学表达式,使代码更容易理解。

  • 不容易出错:如果没有循环,向量化代码通常会更短。更少的代码行意味着更少的机会引入编程错误。

  • 性能:向量化代码通常比包含循环的相应代码运行得快得多。

通用计算向量化代码

这段代码计算了从0到10的1001个值的正弦值:

我= 0;t = 0:。01:10 I = I + 1;y (i) =罪(t);结束

这是相同代码的向量化版本:

t = 0: .01:10;y =罪(t);

第二个代码示例通常比第一个执行得快,是MATLAB的一个更有效的使用。通过创建包含所示代码的脚本来测试系统上的执行速度,然后使用抽搐而且toc函数来度量它们的执行时间。

为特定任务向量化代码

这段代码计算一个向量每5个元素的累积和:

x = 1:1;Ylength = (length(x) - mod(length(x),5))/5;y (1: ylength) = 0;N = 5:5:长度(x) y(N /5) = sum(x(1: N));结束

使用向量化,您可以编写一个更简洁的MATLAB过程。这段代码显示了完成该任务的一种方法:

x = 1:1;xsums = cumsum (x);y = xsums(5:长度(x));

数组操作

数组操作符对数据集中的所有元素执行相同的操作。这些类型的操作对于重复计算非常有用。例如,假设您收集卷(V)以记录其直径(D)和身高(H).如果你只收集一个锥体的信息,你可以计算出这个锥体的体积:

V = 1/12 *π* (D ^ 2) * H;

现在,收集10000个球果的信息。向量D而且H每个包含10,000个元素,您希望计算10,000个卷。在大多数编程语言中,你需要设置一个类似于MATLAB代码的循环:

V(n) = 1/12*pi*(D(n)²)*H(n);结束

用MATLAB,你可以用类似于标量情况的语法对向量的每个元素进行计算:

%矢量化计算V = 1/12 *π* (d . ^ 2)。* H;

请注意

放置句号()。/,,将它们转换为数组操作符。

数组运算符还使您能够组合不同维度的矩阵。这种size-1维度的自动扩展对于向量化网格创建、矩阵和向量操作等非常有用。

假设矩阵一个表示测试分数,其中的行表示不同的类。您需要计算每门课的平均分数和个人分数之间的差异。使用循环,操作如下所示:

A = [97 89 84;95 82 92;64 80 99;76 77 67;...88 59 74;78 66 87;55 93 85);马=意味着(A);B = 0(大小(A));n = 1:size(A,2) B(:,n) = A(:,n) - mA(n);结束

更直接的方法是——意思是(),这避免了循环的需要,速度明显更快。

devA = A -平均值(A)
devA = 18 11 0 16 4 8 -15 2 15 -3 -1 -17 9 19 -10 -1 -12 3 -24 15 1

尽管一个是7 × 3矩阵和意思是(A)是一个1 × 3的向量,MATLAB隐式地展开该向量,就像它有与矩阵相同的大小一样,并且该操作作为一个普通的元素-操作执行。

操作数的大小要求是,对于每个维度,数组的大小必须相同,或者其中一个为1。如果满足这个要求,那么大小为1的一个数组的尺寸将被扩展为与另一个数组中相应的尺寸相同。有关更多信息,请参见基本操作的兼容数组大小

隐式展开对向量化很有用的另一个领域是处理多维数据。假设你想求一个函数的值,F,为两个变量,x而且y

F (x, y) = x * exp (- x2- y2

求这个函数在每一个点的组合上的值x而且y向量,你需要定义一个值的网格。对于这个任务,您应该避免使用循环遍历点组合。相反,如果其中一个向量是列,另一个是行,那么当向量与数组操作符一起使用时,MATLAB会自动构造网格,例如x + yx - y.在这个例子中,x是一个21 × 1的向量和y是一个1 × 16的向量,所以这个运算通过展开的二次维得到了一个21 × 16的矩阵x第一个维度y

x =(2:0.2:2)”;% 21-by-1y = -1.5:0.2:1.5;% 1-by-16F = x。* exp (- x ^ 2 y ^ 2);% 21-by-16

在希望显式创建网格的情况下,可以使用meshgrid而且ndgrid功能。

逻辑数组操作

数组的批量处理的逻辑扩展是向量化比较和决策。MATLAB比较运算符接受向量输入并返回向量输出。

例如,假设在收集10000个锥的数据时,您记录了几个直径的负值。方法可以确定向量中的哪些值是有效的> =接线员:

D = [-0.2 1.0 1.5 3.0 -1.0 4.2 3.14];D > = 0
Ans = 0 1 1 1 0 1 1
你可以直接利用MATLAB的逻辑索引能力来选择有效的锥体积,Vgood的对应元素D都是非负的。
V(D >= 0);

MATLAB允许您对具有函数的整个向量的元素执行逻辑与或所有而且任何,分别。的所有值都可以抛出警告D零度以下:

如果所有(D < 0)警告(“所有直径的值都是负数。”返回结束

MATLAB还可以比较两个具有兼容大小的向量,允许您施加进一步的限制。这段代码找到所有V非负且D大于H

V((V >= 0) & (d > h))
得到的向量与输入的大小相同。

为了便于比较,MATLAB包含特殊值来表示溢出、下溢和未定义的运算符,例如而且.逻辑运算符isinf而且isnan存在,以帮助对这些特殊值执行逻辑测试。例如,排除通常是有用的从计算值:

x = [2 -1 0 3 NaN 2 NaN 11 4 Inf];xvalid = x (~ isnan (x))
xvalid = 2 -1 0 3 2 11 4 Inf . xvalid = 2

请注意

正= =正返回true;然而,南= =南总是返回false。

矩阵运算

在向量化代码时,通常需要构造具有特定大小或结构的矩阵。存在创建统一矩阵的技术。例如,你可能需要一个由相等元素组成的5 × 5矩阵:

一个= 1 (5,5)* 10;
或者,你可能需要一个重复值的矩阵:
v = 1:5;一个= repmat (v, 3,1)
A = 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5

这个函数repmat具有从较小的矩阵或向量构建矩阵的灵活性。repmat通过重复输入矩阵创建矩阵:

A = repmat(1:3,5,2) B = repmat([1 2;3, 2, 2)
A = 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 1 2 3 3 4 1 2 1 2 3 4

排序、设置和计数操作

在许多应用中,对一个向量的一个元素进行的计算依赖于同一向量中的其他元素。例如,一个向量,x,可能代表一个集合。如何迭代通过一个集合没有循环并不明显。当您使用向量化代码时,这个过程变得更加清晰,语法也不那么麻烦了。

消除冗余元素

有许多不同的方法可以找到一个向量的冗余元素。一种方法涉及到函数diff.对向量元素进行排序后,相等的相邻元素在使用diff函数作用于这个向量。因为diff (x)生成一个元素个数小于的向量x,则必须添加一个不等于集合中任何其他元素的元素。总是满足这个条件。最后,你可以使用逻辑索引来选择集合中唯一的元素:

X = [2 1 2 2 3 1 3 2 1 3];x = (x);差异= diff ([x,南]);y = x(区别~ = 0)
Y = 1 2 3
方法也可以完成相同的操作独特的功能:
y =独特(x);
然而,独特的函数可能提供比所需更多的功能,并减慢代码的执行。使用抽搐而且toc函数,如果您想测量每个代码段的性能。

计算Vector中的元素

的集合或子集,而不是仅仅返回x,你可以计算一个元素在一个向量中的出现次数。向量排序之后,可以使用找到函数确定中的零值的指标diff (x)为了显示元素的值在哪里改变。的后续索引之间的差异找到函数表示特定元素的出现次数:

X = [2 1 2 2 3 1 3 2 1 3];x = (x);差异= diff ([x,马克斯(x) + 1]);Count = diff(find([1,difference])) y = x(find(difference))
Count = 3 4 3 y = 1 2 3
找到函数不返回索引元素。你可以数一数而且值使用isnan而且isinf功能。

count_nans =总和(isnan (x (:)));count_infs =总和(isinf (x (:)));

向量化中常用的函数

函数 描述
所有

确定所有数组元素是否为非零或为真

任何

确定是否有数组元素是非零的

cumsum

累计金额

diff

差分与近似导数

找到

查找非零元素的索引和值

ind2sub

从线性下标

ipermute

N-D数组的逆置换维数

逻辑

将数值转换为逻辑值

meshgrid

二维和三维空间中的矩形网格

ndgrid

N-D空间中的矩形网格

交换

重新排列N-D数组的尺寸

刺激

数组元素的乘积

repmat

数组的重复拷贝

重塑

重塑数组

shiftdim

改变尺寸

排序

排序数组元素

挤压

删除单维度

sub2ind

将下标转换为线性下标

总和

数组元素的和

相关的话题

外部网站

Baidu
map