一、向量化的介绍
用for循环和向量计算是非常常见的。例如,下面的代码片段用for循环计算1到100之间的所有整数的平方,平方根,立方根。
for ii=1:100
square(ii)=ii^2;
square_root(ii)=ii^(1/2);
cube_root(ii)=ii^(1/3);
end
下面是用向量计算上面的问题:
ii=1:100;
squre=ii.^2;
squre_root=ii.^(1/2);
cube_root=ii>^(1/3);
尽管两种算法得到了相同的结果,但for循环算法比向量算法慢15倍还多。这是由于MATLAB通过每一次循环时,每行都要翻译执行一次。for循环的实现相当于MATLAB执行了300行代码。相反,如果用向量算法,MATLAB只需要翻译执行4行代码。所以用向量语句它的执行速度非常快。
向量算法的缺点是需要很大的内存,因为一些间接的数组需要创建。MATLAB中,用向量算法代替循环的算法的过程称之为向量化。而向量化能改进许多的MATLAB程序。
在循环执行开始之前,预先分配一个数组,这样也能大大增加循环运行的速度。
二、逻辑数组的运用
逻辑数据类型在MATLAB中并不真实存在。其实,它是带特定的逻辑属性的标准数字型数据类型。逻辑型数组通过所有的关系运算符和逻辑运算符创建。它们区别于数字型是在调用whos命令时,(logical)会出现在类型的后面。
逻辑数组有一个很重要的属性——它在算术运算中能提供一个屏蔽(mask)。屏蔽(mask)是指一个数组,他从另一个数组选择所需的元素参与运算。指定的运算只在选择的元素上执行而不执行任何操作在没有被选中的元素上(即这些元素保持不变)。
例如:
for ii = 1:size(a,1)
for jj = 1:size(a,2)
if a(ii,jj) > 5
a(ii,jj) = sqrt(a(ii,jj));
else
a(ii,jj) = a(ii,jj)^2;
end
end
end
用逻辑数组运算的代码如下:
b = a > 5
a(b) = sqrt(a(b));
a(~b) = a(~b) .^2;
用逻辑数组运算的速度比未用的快的多。