如何使用arrayfun
应用将非标量输出返回到数组的函数?
例如 - 如何对以下代码进行矢量化?
array = magic(5);
A = cell(size(array));
for i=1:5
for j=1:5
A{i,j} = 1:array(i,j);
end
end
这种天真的向量化尝试不起作用,因为输出不是标量
array = magic(5);
result = arrayfun(@(x)(1:x),array);
答案 0 :(得分:6)
有两种方法可以实现它:
可以将“UniformOutput”设置为false。然后,结果是一个单元格数组。
result = arrayfun(@(x)(1:x),array,'UniformOutput',false);
但是我今天发现了一个很好的技巧,功能本身可以返回一个单元格。这样就无需每次都输入'UniformOutput',false
。
result = arrayfun(@(x){1:x},array)
非常有趣这里我不必输入@(X)({1:x})
,但我只能使用花括号@(X){1:x}
编辑(1):正如@Jonas正确指出的那样,毫无疑问不需要常规护腕()
,因为它们是可选的。例如,@(x) x+1
是一种有效的语法。
编辑(2):使用花括号方法或UniformOutput,false
之间存在细微差别。当输入数组为空时,它们的行为是不同的。
答案 1 :(得分:1)
除了安德烈的答案之外,我想要注意的是,使用选项UniformOutput的第一种方法似乎稍快一些:
>> tic; cellfun(@(x) {single(x)}, data); toc;
Elapsed time is 0.031817 seconds.
>> tic; cellfun(@(x) single(x), data,'UniformOutput',0); toc;
Elapsed time is 0.025526 seconds.