首发公众号:120701101。
从自学者的角度讲起。如果感兴趣,可以及时关注,咱们一起进步。
公众号中可以获取大量的学习资料。
今天介绍一个内置函数——arrayfun函数。
先看看官方的介绍,然后我再说说我的理解以及什么时候用。
目录
1、ARRAYFUN函数介绍
2、不用arrayfun函数的代码
3、使用arrayfun函数的代码
4、使用情况及反思
正文
1、ARRAYFUN函数介绍
arrayfun
将函数应用于每个数组元素
语法
B = arrayfun(func,A)
B = arrayfun(func,A1,...,An)
B = arrayfun(___,Name,Value)
[B1,...,Bm] = arrayfun(___)
说明
B = arrayfun(func,A) 将函数 func 应用于 A 的元素,一次一个元素。
然后 arrayfun 将 func 的输出串联成输出数组 B,因此,对于 A 的第 i 个元素来说,B(i) = func(A(i))。
输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。
func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和 B 必须具有相同的大小。
您不能指定 arrayfun 计算 B 的各元素的顺序,也不能指望它们按任何特定的顺序完成计算。
B = arrayfun(func,A1,...,An) 将 func 应用于数组 A1,...,An 的元素,因此 B(i) = func(A1(i),...,An(i))。
函数 func 必须接受 n 个输入参数并返回一个标量。数组 A1,...,An 的大小必须全部相同。
B = arrayfun(___,Name,Value) 应用 func 并使用一个或多个 Name,Value 对组参数指定其他选项。
例如,要以元胞数组形式返回输出值,请指定 'UniformOutput',false。
当 func 返回的值不能串联成数组时,可以按元胞数组的形式返回 B。
您可以将 Name,Value 对组参数与上述任何语法中的输入参数结合使用。
当 func 返回 m 个输出值时,[B1,...,Bm] = arrayfun(___) 返回多个输出数组 B1,...,Bm。
func 可以返回不同数据类型的输出参数,但每一次调用 func 时返回的每个输出的数据类型必须相同。
您可以将此语法与前面语法中的任何输入参数结合使用。
从 func 返回的输出参数的数量可以不同于 A1,...,An 指定的输入参数的数量。
从官方的角度说的也比较清楚。就是说你有一个(句柄)函数,然后又有一些离散数据。那么arrayfun函数帮你把你的离散数据一个一个的带入到句柄函数中求值。
好像做起来感觉很简单。其实不然,我们以一个数值积分的例子来看看。
下面我用的是辛普森积分法来演示。
2、不用arrayfun函数的代码
function Integral = Simpson(fun, a, b, n)
h = (b - a) / n;
x = a : h : b;
Integral = 0;
for i = 1 : 2: n
Integral = Integral + fun(x(i)) + 4*fun(x(i+1)) + fun(x(i+2));
end
Integral = (h / 3) * Integral;
end
3、使用arrayfun函数的代码
function Integral = simPsonThird(fun, a, b, n)
h = (b - a) / n;
x = a : h : b;
Integral = h/3 * (fun(x(1)) + fun(x(end))...
+ 4*sum(arrayfun(fun, x(2:2:end-1)))...
+ 2*sum(arrayfun(fun, x(3:2:end-2))));
end
很明显,使用arrayfun函数可以减少循环。MATLAB本来就是矩阵实验室,最好走向量化语言。
4、使用情况及反思
当你编写有代入自变量到函数中求值的循环语句时,就可以着手考虑一下能不能使用arrayfun函数。尤其是那些自变量又是可以用索引方式提取的,更应该考虑。
使用arrayfun函数绘图也是一个很省力的方式,在官方的帮助文档就有这样的例子。