矢量

使用矢量

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;

现在,收集上万个视锥细胞的信息。矢量dH每个含有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

在要明确创建的网格的情况下,你可以使用meshgridndgrid功能。

逻辑数组操作

阵列的批量处理的逻辑扩展到矢量化的比较和决策。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
您可以直接利用MATLAB的逻辑索引功率来选择有效的圆锥的体积,Vgood,对于其中相应的元件d都是非负的:
Vgood = V(d> = 0);

MATLAB,可以执行一个逻辑AND或OR上的整个矢量的与功能的元件所有任何, 分别。你可以抛出一个警告,如果所有值的d低于零:

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

MATLAB还可以比较兼容大小两种载体,让您进一步施加限制。这个代码是找到所有的值,其中V为负,并且d大于H

V((V> = 0)&(d> H))
将得到的矢量,其大小与输入相同。

为了帮助比较,MATLAB含有特殊的值来表示溢,下溢和不确定的运营商,如天道酬勤为NaN。逻辑运算符isinfisnan存在帮助执行这些特殊值逻辑测试。例如,它常常是有用的排除为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天道酬勤使用值isnanisinf功能。

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

功能矢量常用

功能 描述
所有

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

任何

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

cumsum

累计总和

DIFF

差异和近似衍生物

查找非零元素的指标和值

ind2sub

从线性索引标

ipermute

的N- d阵列的逆置换尺寸

合乎逻辑

将数字值逻辑值

meshgrid

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

ndgrid

在N- d空间矩形网格

置换

的N- d阵列的重新排列尺寸

数组元素的产物

repmat

阵列的重复副本

重塑

整形数组

shiftdim

移尺寸

分类

排序的数组元素

删除单维度

sub2ind

标转换为线性指标

数组元素的总和

相关话题

外部网站