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

And*_*ein 2 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
Run Code Online (Sandbox Code Playgroud)

这种天真的向量化尝试不起作用,因为输出不是标量

array = magic(5);
result = arrayfun(@(x)(1:x),array);
Run Code Online (Sandbox Code Playgroud)

And*_*ein 6

有两种方法可以实现它:

可以将"UniformOutput"设置为false.然后,结果是一个单元格数组.

   result = arrayfun(@(x)(1:x),array,'UniformOutput',false);
Run Code Online (Sandbox Code Playgroud)

但是我今天发现了一个很好的技巧,功能本身可以返回一个单元格.这消除了'UniformOutput',false每次键入的需要.

    result = arrayfun(@(x){1:x},array)
Run Code Online (Sandbox Code Playgroud)

什么是真正有趣的在这里,我不必键入@(X)({1:x}),但我可以定义它只能使用花护腕@(X){1:x}

编辑(1):正如@Jonas正确指出的那样,毫无疑问()不需要常规护腕,因为它们是可选的.例如,@(x) x+1是一种有效的语法.

编辑(2):使用大括号方法或者使用大括号方法之间存在细微差别UniformOutput,false.当输入数组为空时,它们的行为是不同的.

  • 你永远不需要函数周围的括号.但它对可见性有很大帮助.此外,`arrayfun`并不*真正*矢量化代码,它只是隐藏循环(并且如果它值得花时间,将允许Matlab多线程).请注意,对于没有`uniformOutput`选项的`accumarray`,单元格"技巧"非常有用. (5认同)