% 定义一个句柄并用这个句柄求值 h = @sin; h(3) % % 命令窗口返回内容 % h(3) % ans = % 0.1411 %定义一个完整句柄,@参数+表达式的形式,并给句柄传参 h1 = @(x)mean(x); x = [1 2 3 4 5]; h1(x) % % 命令窗口返回内容 % h1(x) % ans = % 3 %arrayfun的简单应用 h1 = @(x)mean(x); x = [1 2 3 4 5]; % 可以用句柄的形式传入第一个形参位置,也可以直接@句柄内容,这两个是等价的 arrayfun(@(x)mean(x),x) arrayfun(h1,x) % % 命令窗口返回内容 % ans = % 1 2 3 4 5 % ans = % 1 2 3 4 5 %arrayfun对Name,value的要求(只举例格式化形式'UniformOutput') x = [1 2 3 4 5]; % 如果选择为false以元胞的形式返回值 arrayfun(@(x)mean(x),x,'UniformOutput',false) % 如果选择为true以数组的形式返回值 arrayfun(@(x)mean(x),x,'UniformOutput',true) % % 命令窗口返回内容 % ans = % 1×5 cell 数组 % {[1]} {[2]} {[3]} {[4]} {[5]} % ans = % 1 2 3 4 5 % arrayfun对于提升运算效率的帮助 % 不采用arrayfun形式的运算 tic; x = magic(3000)*magic(3000); toc; % 时间已过 3.125284 秒。 % 采用arrayfun形式的运算 tic; arrayfun(@(n)magic(n)*magic(n),3000,'UniformOutput',false); toc; % 时间已过 3.125284 秒。
我们分采用运算的时候,第二遍比第一遍快,主要是MATLAB的内存预分配机制。
注意采用arrayfun值是标量形式必须选择false
arrayfun主要是为了打开并行运算库而设计
我们打开并行运算
% arrayfun对于提升运算效率的帮助 % 不采用arrayfun形式的运算 tic; x = magic(5000)*magic(5000); toc; % 时间已过 14.077466 秒。 % 采用arrayfun形式的运算 tic; arrayfun(@(n)magic(n)*magic(n),5000,'UniformOutput',false); toc; % 时间已过 13.423996 秒。
我们发现运算效率提升不太明显,因为arrayfun针对标量的运算方式,如果对于像魔方矩阵,可以用meshgrid分解的方式提升更明显