将函数传递给arrayfun

Ne_*_*tra 3 matlab function

如果我将匿名函数传递给arrayfun如下:

arrayfun(@(x)sprintf('%.2g\\pi', x/pi), [0 6 7 8], 'uni', 0)
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

ans = 
    '0\pi'    '1.9\pi'    '2.2\pi'    '2.5\pi'
Run Code Online (Sandbox Code Playgroud)

但是,如果我声明一个单独的函数:

function y = sprint_func_0(x)
    sprintf('%.2g\\pi', x/pi)
end
Run Code Online (Sandbox Code Playgroud)

并传递给arrayfun:

arrayfun(@(x)sprint_func_0(x), [0 6 7 8], 'uni', 0)
Run Code Online (Sandbox Code Playgroud)

结果是:

ans =
    0\pi

ans =
    1.9\pi

ans =
    2.2\pi

ans =
    2.5\pi
Run Code Online (Sandbox Code Playgroud)

为什么我在第一种情况下获得一个输出而在第二种情况下获得许多输出?这可能是愚蠢的,但我无法在任何地方找到答案.

Eit*_*n T 5

在第一种情况下,匿名函数返回一个字符串,因此arrayfun返回一个字符串的单元格数组.

在第二种情况下,该函数不会为输出参数赋值y(实质上是将输出打印sprintf到命令窗口).

如果您将功能修改sprint_func_0为:

function y = sprint_func_0(x)
    y = sprintf('%.2g\\pi', x/pi); %// Note the assignment to y
end
Run Code Online (Sandbox Code Playgroud)

你应该得到相同的结果.

  • @TryHard一般来说,它肯定是不好的做法,虽然它不需要导致错误,因为`y`可以例如从mat文件加载.但是,在这种情况下,如果使用零输出参数调用该函数,则该函数只会正常运行.确实有点奇怪,因为我总是假设matlab默认调用一个带有1个输出参数的函数,如果没有指定它应该去的地方,则将它分配给ans. (2认同)