主要内容

向量化

使用向量化

MATLAB®涉及矩阵和向量的优化操作。修改循环的过程中,scalar-oriented代码使用MATLAB矩阵和向量操作向量化。Vectorizing代码是值得的几个原因:

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

  • 不容易出错:没有循环,向量化代码往往是短的。更少的代码意味着更少的机会介绍编程错误。

  • 性能:向量化代码通常包含循环运行速度远远超过相应的代码。

为通用计算Vectorizing代码

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

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

这是一个矢量化版本的相同的代码:

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

第二个代码示例通常执行速度比第一次和更有效地利用MATLAB。在您的系统测试执行速度通过创建包含代码的脚本,然后使用抽搐toc函数来衡量他们的执行时间。

为特定任务Vectorizing代码

这段代码计算一个向量的总合在每个第五元素:

x = 1:1;ylength =(长度(x) - mod(长度(x), 5)) / 5;y (1: ylength) = 0;n = 5:长度(x) y (n / 5) = (x (1: n))总和;结束

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

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

数组操作

数组运算符执行相同的操作数据集的所有元素。这些类型的操作是很有用的重复计算。例如,假设您收集卷(V各种锥通过记录他们的直径(的)D)和高度(H)。如果你收集的信息只有一个锥,你可以计算单圆锥的体积为:

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

现在,在10000锥上收集信息。向量DH每个包含10000个元素,你要计算10000卷。在大多数编程语言中,您需要设置一个循环类似的MATLAB代码:

n = 1:1 V (n) = 1/12 *π* (D (n) ^ 2) * H (n);结束

使用MATLAB,您可以为每个元素执行计算的矢量与标量情况类似的语法:

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

请注意

放置一段时间(运营商之前)*,/,^转换成数组操作符。

数组运算符还使您能够结合不同维度的矩阵。这种自动扩张vectorizing网格的大小是1维是有用的创建、矩阵和向量操作等等。

假设矩阵一个代表考试分数,行表示不同的类。你想计算平均得分之间的差异和个人得分为每个类。使用一个循环,操作看起来像:

= (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:尺寸(2)B (:, n) = (:, n) - mA (n);结束

一个更直接的方法是——意思是()避免了一个循环的需要,显著加快。

天神=——意思是()
天神= 18 11 0 16 4 8 -15 2 3 1 -17 9 -19 -10 1 -12 3 -24 15 1

尽管一个是7-by-3矩阵和意思是(A)是一个1×3向量,MATLAB含蓄地扩展了向量矩阵一样如果有相同的大小,和操作执行正常element-wise -操作。

操作数的大小要求是,对于每一个维度,数组必须有相同的大小或其中之一是1。是否满足这个需求,然后维度的数组大小1扩大是相同的大小相应的维度在另一个数组中。有关更多信息,请参见兼容数组大小的基本操作

隐式扩张的另一个领域是用于向量化处理多维数据。假设你想评估一个函数,F两个变量,xy

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

评估这个函数在每一个点的组合xy向量,您需要定义一个网格的值。这个任务你应该避免使用循环来遍历点组合。相反,如果一个向量是一个列,另一个是一行,然后用MATLAB时自动构造网格向量是使用数组运营商等x + yx - y。在这个例子中,x是21-by-1向量和y1-by-16向量,所以操作产生21-by-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

在这种情况下,你想要显式地创建网格,您可以使用meshgridndgrid功能。

逻辑数组操作

批量处理的逻辑扩展数组是比较和决策进行向量化。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都是非负的。
Vgood = V (D > = 0);

MATLAB允许您执行逻辑或或整个向量元素的功能所有任何,分别。你可以把一个警告如果所有的值D零度以下:

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

MATLAB与兼容的大小,还可以比较两个向量允许您采取进一步的限制。这段代码发现的所有值,V是负的D大于H:

V (V (> = 0) & (D > H))
由此产生的向量是一样大小的输入。

帮助之下,MATLAB包含特殊的值来表示溢出,和未定义的操作,比如下溢。逻辑运算符isinfisnan的存在是为了帮助这些特殊值执行逻辑测试。例如,它经常是有用的排除从计算值:

x =[2 1 0 3南2南11 4正);xvalid = x (~ isnan (x))
xvalid = 2 1 0 3 2 11 4正无穷

请注意

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

矩阵运算

当vectorizing代码时,您经常需要构造一个矩阵与一个特定的大小或结构。技术存在创建统一的矩阵。例如,您可能需要一个5-by-5矩阵相等的元素:

一个= 1 (5,5)* 10;
或者,您可能需要重复值的矩阵:
v = 1:5;一个= repmat (v, 3,1)
一个= 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)
一个= 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 B = 1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4

排序、设置和计算操作

在许多应用程序中,计算一个向量的元素上进行依赖于其他元素在同一个向量。例如,一个向量,x,可能代表一组,如何遍历一组没有循环并不明显。这个过程变得更清晰,语法不麻烦当你使用矢量化代码。

消除冗余元素

不同的方式寻找一个向量的冗余元素存在。一个方法涉及到的功能diff。在排序向量元素后,等于相邻元素产生一个零输入时使用diff函数向量。因为diff (x)比少一个元素产生一个向量x,您必须添加一个元素,不等于任何其他元素集。总是满足这个条件。最后,您可以使用逻辑索引选择独特的元素设置:

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

计算元素的向量

而不是仅仅返回一组,或子集x,您可以计算一个元素的出现在一个向量。向量排序后,您可以使用找到函数来确定零值的指数diff (x)和显示的元素变化值。随后的指数从之间的区别找到函数表示为一个特定的元素出现的数量:

x = [2 1 2 2 3 1 2 1 3];x = (x);差异= diff ([x,马克斯(x) + 1]);数= diff(找到([1,差异]))y = x(找到(差异))
数= 3 4 3 y = 1 2 3
找到函数不返回指数元素。你可以数一数值使用isnanisinf功能。

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

函数通常用于向量化

函数 描述
所有

确定所有的数组元素非零或事实

任何

确定任何数组元素非零

cumsum

累计金额

diff

差异和近似的衍生品

找到

发现指数和非零元素的值

ind2sub

从线性索引下标

ipermute

逆交换一天数组的维度

逻辑

将数值转换为逻辑值

meshgrid

矩形网格在2 d和3 d空间

ndgrid

矩形网格在一天的空间

交换

重新排列一天数组的维度

刺激

数组元素的乘积

repmat

重复的数组

重塑

重塑数组

shiftdim

改变尺寸

排序

排序数组元素

挤压

删除单维度

sub2ind

下标转换为线性指标

总和

数组元素的总和

相关的话题

外部网站