向量化
使用向量化
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锥上收集信息。向量D
和H
每个包含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
两个变量,x
和y
。
F (x, y) = x * exp (- x2- y2)
评估这个函数在每一个点的组合x
和y
向量,您需要定义一个网格的值。这个任务你应该避免使用循环来遍历点组合。相反,如果一个向量是一个列,另一个是一行,然后用MATLAB时自动构造网格向量是使用数组运营商等x + y
或x - y
。在这个例子中,x
是21-by-1向量和y
1-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
逻辑数组操作
批量处理的逻辑扩展数组是比较和决策进行向量化。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
Vgood
,相应的元素D
都是非负的。Vgood = V (D > = 0);
MATLAB允许您执行逻辑或或整个向量元素的功能所有
和任何
,分别。你可以把一个警告如果所有的值D
零度以下:
如果所有(D < 0)警告(“所有的直径值是负的。”)返回结束
MATLAB与兼容的大小,还可以比较两个向量允许您采取进一步的限制。这段代码发现的所有值,V是负的D
大于H
:
V (V (> = 0) & (D > H))
帮助之下,MATLAB包含特殊的值来表示溢出,和未定义的操作,比如下溢正
和南
。逻辑运算符isinf
和isnan
的存在是为了帮助这些特殊值执行逻辑测试。例如,它经常是有用的排除南
从计算值:
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
找到
函数不返回指数南
元素。你可以数一数南
和正
值使用isnan
和isinf
功能。
count_nans =总和(isnan (x (:)));count_infs =总和(isinf (x (:)));