MATLAB®对于涉及矩阵和向量操作进行了优化。修正基于循环的,面向标量的代码以使用MATLAB矩阵运算和矢量运算的过程称为矢量。矢量化你的代码有以下几个原因值得:
出现:矢量数学代码出现更像数学表达式在教科书中,使代码更容易理解。
不容易出错:如果没有循环,量化代码往往较短。更少的代码意味着更少的机会来介绍编程错误。
性能:矢量化代码通常运行速度比含环的相应的码快得多。
此代码计算1001倍的值范围从0到10的正弦:
I = 0;对于t = 0:0.01:10 I = I + 1;Y(I)= SIN(T);结束
这是相同的代码的向量化版本:
t = 0时:0.01:10;Y = SIN(T);
第二个代码示例通常执行比第一速度更快,是更有效地利用MATLAB的。通过创建包含显示的代码,然后使用该脚本您的系统上测试执行速度抽搐
和TOC
功能来衡量他们的执行时间。
这个代码在计算每第五个元素的向量的累积和:
X = 1:10000;ylength =(长度(X) - MOD(长度(X),5))/ 5;Y(1:ylength)= 0;对于n = 5:5:长度(X)Y(N / 5)=总和(X(1:N));结束
使用矢量,你可以写一个更简洁的MATLAB程序。这段代码显示了完成任务的一种方法:
X = 1:10000;xsums = cumsum(X);Y = xsums(5:5:长度(X));
数组运算符执行相同的操作对于数据集中的所有元素。这些类型的操作是重复计算有用。例如,假设您收集的体积(V
)通过记录它们的直径的各种锥(d
)和高度(H
)。如果您收集的只是一个锥形的信息,就可以计算出该单牙轮音量:
V = 1/12号* PI *(d ^ 2)* H;
现在,收集上万个视锥细胞的信息。矢量d
和H
每个含有10,000个元素,并且要计算10,000只供货量。在大多数编程语言,你需要建立一个类似这个MATLAB代码回路:
对于N = 1:10000 V(N)= 1/12 * PI *(d(n)的^ 2)* H(N));结束
使用MATLAB,可以用于与语法作为标量的情况下类似的一个向量的每个元素执行计算:
%矢量化计算V = 1/12号* PI *(D. ^ 2)* H。;
放置一段时间(。
)运营商之前*
,/
和^
,将它们转换为数组运算符。
数组运算符还能让您不同维度的矩阵合并。此大小-1的尺寸自动膨胀是更为矢量化网格创建,矩阵运算和矢量运算是有用的,。
假设矩阵一个
表示测试分数,其中表示不同类的行。你要计算平均得分和个人得分为每个类之间的差别。使用循环中,操作是这样的:
A = [97 89 84;95 82 92;64 80 99; 76 77 67;...88 59 74;78 66 87;55 93 85];MA =平均值(A);B =零(尺寸(A));对于N = 1:尺寸(A,2)B(:,N)= A(:,N) - 毫安(N);结束
更直接的方式来做到这一点是A - 平均值(A)
,这避免了环路的需要,是显著更快。
德瓦= A - 平均(A)
德瓦= 18 11 0 16 4 8 -15 2 15 -3 -1 -17 -19 9 -10 -12 -1 -24 3 15 1
即使一个
是7×3矩阵和意思是(A)
是一个1×3向量,MATLAB隐含地扩展了矢量作为如果它有相同大小的矩阵,以及操作执行作为一个正常的逐元素减去操作。
为操作数的尺寸的要求是,对于每个维度,阵列必须具有相同的尺寸或它们中的一个是1,如果满足这个要求,则其中所述阵列中的一个已经大小1被扩展尺寸是相同的大小作为其他阵列中的相应尺寸。欲了解更多信息,请参阅支持数组大小的基本操作。
其中隐含的扩张是矢量有用的另一个方面是,如果你是多维数据的工作。假设你要评估的功能,F
,两个变量,X
和ÿ
。
F(X,Y)= X * EXP(-x2- ÿ2)
要在点的每个组合评估此功能X
和ÿ
矢量,你需要定义值的网格。对于这个任务,你应该避免通过点的组合使用循环迭代。相反,如果该矢量中的一个是柱,另一个是一排,然后MATLAB自动构造,当向量用数组运算符使用,如网格X + Y
要么X-Y
。在这个例子中,X
是一个21×1矢量和ÿ
是1×16矢量,所以操作通过扩大的第二维产生21×16矩阵X
和的第一维ÿ
。
X =(-2:0.2:2)';%21×1Y = -1.5:0.2:1.5;%1×16F = X * EXP(-x ^ 2-Y ^ 2);%21×16
阵列的批量处理的逻辑扩展到矢量化的比较和决策。MATLAB比较运算符接受向量的输入和返回向量输出。
例如,假设而10,000锥收集数据,您为直径记录多个负值。您可以确定这在一个矢量值有效与> =
运营商:
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,可以执行一个逻辑AND或OR上的整个矢量的与功能的元件所有
和任何
, 分别。你可以抛出一个警告,如果所有值的d
低于零:
如果所有(d <0)警告(“直径的所有值都是负的。”)返回结束
MATLAB还可以比较兼容大小两种载体,让您进一步施加限制。这个代码是找到所有的值,其中V为负,并且d
大于H
:
V((V> = 0)&(d> H))
为了帮助比较,MATLAB含有特殊的值来表示溢,下溢和不确定的运营商,如天道酬勤
和为NaN
。逻辑运算符isinf
和isnan
存在帮助执行这些特殊值逻辑测试。例如,它常常是有用的排除为NaN
从计算值:
X = [2 -1 0 3的NaN 2的NaN 11 4 Inf文件]。xvalid = X(〜isnan(X))
xvalid = 2 -1 0 3 2 11 4 Inf文件
天道酬勤==天道酬勤
返回true;然而,为NaN == NaN的
始终返回false。
当矢量化代码,您经常需要构造一个矩阵具有特定大小或结构。技术来创建统一的矩阵存在。例如,您可能需要等元素的5×5矩阵:
A =酮(5,5)* 10;
V = 1:5;A = 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 4],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 B = 1 2 1 2 3 4 3 4 1 2 1 2 3 4 3 4
在许多应用中,一个向量的元素上完成的计算方法取决于在同一载体中的其他元素。例如,载体,X,可能代表一组。如何通过一组没有一个迭代对于
要么而
循环并不明显。该过程变得更清晰,语法不太笨重,当你使用量化代码。
许多不同的方式存在查找矢量的冗余元件。一种方式涉及的功能DIFF
。排序向量元素之后,当使用同样的相邻元件产生零条目DIFF
上该矢量的功能。因为DIFF(x)的
产生具有比少一个元件的载体X
,你必须添加不等于集合中的任何其他元素的元素。为NaN
总是满足这一条件。最后,你可以使用逻辑索引,以选择在一组独特的元素:
X = [2 1 2 2 3 1 3 2 1 3];X =排序(X);差= DIFF([X,为NaN]);Y = X(差〜= 0)
Y = 1 2 3
独特
功能:Y =唯一的(X);
独特
比所需要的功能可能会提供更多的功能,减缓你的代码的执行。使用抽搐
和TOC
功能如果要测量每个代码段的表现。
而不是仅仅返回集或子集的X
,你可以指望一个元素的出现在载体中。矢量排序后,您可以使用找
函数来确定在零个值的索引DIFF(x)的
并且,以显示其中元素改变值。从随后的指数之间的差异找
函数指示出现一个特定元件的数目:
X = [2 1 2 2 3 1 3 2 1 3];X =排序(X);差= DIFF([X,MAX(X)1]);计数= DIFF(找到([1,差))Y = X(找到(差))
计数= 3 4 3 Y = 1 2 3
找
功能不返回指数为NaN
元素。你可以指望的数量为NaN
和天道酬勤
使用值isnan
和isinf
功能。
count_nans =总和(isnan(X(:)));count_infs =总和(isinf(X(:)));