定义具有多个输出的函数,这些函数无法组织成矩阵

时间:2017-11-08 07:45:06

标签: matlab function output containers grouping

是否有任何自然方法来定义具有多个输出的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

除了可能的性能问题,这种方法看起来非常不自然和笨拙。有没有更好的方法?

2 个答案:

答案 0 :(得分:4)

在MATLAB中,您可以使用以下语法返回任意数量的输出:

function [A,B] = f(x)
  A = ...;
  B = ...;
end

这是一个比python中使用的元组更优雅的解决方案。 您甚至可以使用输入和输出的数量(narginnargout)来控制行为,并使用波浪号丢弃输出。 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