【问题标题】:Defining a function with multiple outputs that can't be organised into a matrix定义一个不能组织成矩阵的具有多个输出的函数
【发布时间】:2018-04-20 19:32:06
【问题描述】:

是否有任何自然方法来定义具有多个输出的 MATLAB 函数,这些输出不能或不适合“堆叠”到矩阵中?例如,如果我想要一个函数f,它返回一个3x3 矩阵A 一个4x4 矩阵B

我真的很惊讶这甚至会成为 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

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

【问题讨论】:

  • 我不明白这个问题,只是将输出定义为 [A, B] 确定?
  • @nkjt 抱歉,我在考虑如何让它像 Python 一样工作。是的,你完全正确。只是在 matlab 中,如果我只想访问函数的第二个输出,比如在这种情况下,[~, second_out]=f(x);,我将付出更多的努力,而在 Python 中,我可以只做 second_out = f(x)[1]
  • Matlab 不太支持容器的概念 它支持。相当于 Python 的列表或元组(可能是异构事物的容器)是 cell array

标签: matlab function output containers grouping


【解决方案1】:

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

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

这是一个比 python 中使用的元组更优雅的解决方案。 您甚至可以使用输入和输出的数量(narginnargout)控制行为,并使用波浪号丢弃输出。 More information here。 我想不出更优雅的语法。

【讨论】:

  • 赞成 我想不出更优雅的语法 :-D
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 2018-09-07
    • 1970-01-01
    • 2016-01-25
    • 2011-07-07
    • 1970-01-01
    • 2020-07-16
    • 2014-10-16
    相关资源
    最近更新 更多