在数组上应用函数,以向量化方式返回不同大小的输出

时间:2012-01-28 10:54:59

标签: matlab vectorization

如何使用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);

2 个答案:

答案 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.