是否有任何自然方法来定义具有多个输出的MATLAB函数,这些函数不能或不适合“堆叠”到矩阵中?例如,如果我希望函数f
返回3x3
矩阵A
和 4x4
矩阵B
,该怎么办?< / p>
我真的很惊讶这甚至是MATLAB中的一个问题。因为在Python中,我们需要做的只是return A, B
,它返回两者的元组。然而,似乎MATLAB并不完全支持容器的概念。作为一种非优雅的解决方法,我可以使用struct
将两个数据放入其中,函数类似于:
function re = f(x)
%f: returns two dimensional-inconsistent matrices A and B
% function body as follows
....
A = ...;
B = ...;
% put data into the struct 're'
re.A = A;
re.B = B;
end
除了可能的性能问题,这种方法看起来非常不自然和笨拙。有没有更好的方法?
答案 0 :(得分:4)
在MATLAB中,您可以使用以下语法返回任意数量的输出:
function [A,B] = f(x)
A = ...;
B = ...;
end
这是一个比python中使用的元组更优雅的解决方案。
您甚至可以使用输入和输出的数量(nargin
和nargout
)来控制行为,并使用波浪号丢弃输出。 More information here。
我想不出更优雅的语法。
答案 1 :(得分:2)
通常在有多个输出时,应该按如下方式声明函数:
function [out1, out2, ... , outN] = funcName(in1,...,inM)
...
end
MATLAB还允许您分别通过nargin
/ nargout
函数根据请求的输入/输出量更改函数的行为(您可以将其视为重载的一种形式) )。
例如,您可以指定一个数组,指示您希望函数提供哪些输出,然后相应地填充varargout
单元格数组:
function varargout = funcName(in1,...,whichOut)
...
for indO = 1:numel(whichOut)
switch whichOut{indO}
case 'out1'
varargout{indO} = out1;
case 'out2'
... etc
case 'out6'
varargout{indO} = out6;
end
end
然后使用[out6, out1] = funcName(inp, {'out6','out1'});
另见varargin
。