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

在Matlab中,为什么cellfun(@size,x)对于非标量值不要求UniformOutput False?,matlab,Matlab,在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有什么不同?有没有办法使自定义函数的行为与大小相同

在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有什么不同?有没有办法使自定义函数的行为与大小相同


谢谢

你会被尺寸弄糊涂。大小允许单个输出(向量)或多个输出参数

%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);

有趣。这似乎与以下事实有关:
size
返回可变数量的输出如果我的伪函数的输出被解释为向量的一个输出,我如何将它解释为多个输出?您可以使用
deal
生成具有多个输出参数的匿名函数。例如,
f=@(x)交易(x.^2,x.^3)
。使用
[a,b]=f(2)
调用以获得这两个结果,或者使用
[a,~]=f(2)
[~,b]=f(2)
仅获取其中一个输出。当然,这并不能使您获得可变数量的输出参数——为此,您需要按照建议使用
varargout
定义一个函数。