在Matlab中,为什么对于非标量值,cellfun(@size, x)不需要UniformOutput False参数?

3

在Matlab中,你可以进行以下操作:

x = {1:4, rand(3,3,3), 3};
[a, b, c] = cellfun(@size, x);

上述虽然输出不是标量类型,但不需要设置UniformOutput为false。

如果我有如下代码:

x = {1:4, rand(3,3,3), 3};
[a,b,c] = cellfun(@(my_dummy_fun) [1, 2, 3], x);  % GIVES ERROR

我收到一个错误。这与@size有什么不同?有没有办法使自定义函数具有与size相同的行为?
谢谢!

1
有趣。看起来这与size返回可变数量的输出有关。 - Luis Mendo
1个回答

2
你可能对“size”这个词感到困惑。它可以用于输出一个向量或多个输出参数。请注意,保留了HTML标签。
%three outputs
[a,b,c]=size(rand(3,3,3))
%one output
[x]=size(rand(3,3,3))

其中 x = [a,b,c]

你已经成功地使用了带有三个输出参数的 size 函数,但是你的函数句柄只有一个输出参数(即一个向量)。

我不知道是否有可能直接定义一个具有多个输出参数的匿名函数的语法。为了解决这个问题,我编写了这个小的包装函数:

function varargout=vec2nargout(in)
varargout=mat2cell(in(:),ones(1,nargout));
end

它允许:

[a,b,c] = cellfun(@(my_dummy_fun)vec2nargout([1,2,3]), x);

如果我的虚拟函数的输出被解释为向量的一个输出,我该如何将其解释为多个输出? - TallBrianL
1
你可以使用 deal 创建具有多个输出参数的匿名函数。例如,f = @(x)deal(x.^2,x.^3)。调用 [a,b]=f(2) 来获取两个输出值,或者使用 [a,~]=f(2)[~,b]=f(2) 来获取其中一个输出值。当然,这并不能让你获得可变数量的输出参数 - 为此,你需要像你建议的那样定义一个带有 varargout 的函数。 - Sam Roberts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接