【问题标题】:How to get all outputs (MatLab)?如何获得所有输出(MatLab)?
【发布时间】:2014-07-09 15:02:00
【问题描述】:

假设我有一个函数给出未知数量的输出参数(它取决于输入,因此通过循环改变)。如何全部获得?

nargout 没有帮助,因为该函数使用 varargout(结果为 -1)

当然我不能重写函数,否则问题就不会出现:-)

【问题讨论】:

  • 你知道输入 - 你是说你仍然不知道函数返回多少输出?输出可能取决于输入,但通常应该在输入和输出数量之间存在简单的关系……至少对于设计合理的功能而言。
  • 尝试将输出分配给单个变量。如果使用 varargout,则此变量本身应该是一个元胞数组。找出它的长度。
  • 实际上,我正在努力寻找一个合理的情况,即您不知道会有多少输出。你能举个例子吗?
  • 有趣的问题。我不得不猜测对此没有好的通用解决方案。我认为函数调用(与函数定义相反)的输出数量必须在评估函数之前定义nargout 的帮助建议了这一点:“在用户定义函数的主体内,nargout 返回用于调用函数的输出参数的数量。” (请注意,这是指在您的函数内部使用varargout,而不是在您正确的地方,它在这里并没有真正的帮助。)
  • @Noxobar 恕我直言,这是唯一正确的方法。每个编写返回变量和先验未知数量输出的函数的人都应该受到惩罚。这只是一个非常糟糕的例子,说明如何使用具有多个输出的特性......

标签: matlab output


【解决方案1】:

好的,感谢所有参与讨论的人。总而言之,这个问题似乎没有通用的解决方案,因为 MatLab 本身会在函数调用之前估计所需输出的数量以在其中使用。不过可以指出三种情况:

1) 函数在定义中没有varargout,因此nOut=nargout(@fcn) 返回正数。

那么nOut 是实际的输出数量,我们可以使用元胞数组和列列表技巧。

X=cell(1,nOut);
[X{:}]=fcn(inputs);

2) 函数定义中有varargout,因此nOut=nargout(@fcn) 返回负数。但是可以找到与输入的一些相关性(例如length(varargin)=length(varargout))。

然后我们可以从inputs 计算出nOut 并执行上面的列列表技巧。

3) 你认识fcn 开发者。

请他帮忙。例如使函数的输出成为一个元胞数组。

【讨论】:

  • 我认为这个问题没有适当的通用解决方案,但我确实找到了一般解决方案。
【解决方案2】:

在这种情况下,我通常使用的一种方法是将所有输出存储在函数内部的元胞数组中。将元胞数组放在函数体之外,您可能会调查它的长度和其他属性。

【讨论】:

  • 我无权访问该功能 :- ) 如果有,应该不会出现问题 :- )
  • 这可能会有所帮助,但它(当然)需要编辑相关功能。
  • 尝试将输出分配给单个变量。该变量本身应该是一个元胞数组。找出它的长度。
  • 假设函数是unique,你不知道它有3个输出参数,你会怎么处理呢?
  • @DennisJaheruddin 很好,如果函数有 3 个固定 参数(定义为function [a,b,c]=unique),那么我只需调用Nout=nargout(unique)。但是如果函数使用varargout,那么Nout 总是-1(或-n,其中n 是固定参数的数量)@freude 没有。在所有情况下,输出都会等待类似[X{:}] 的列表,其中X=cell(1,Nout)。但是在我确切地知道Nout 之前,一切都不起作用。
【解决方案3】:

一般来说,您可以通过以下方式处理该问题。我之前没有提到这个解决方案,因为……太可怕了。

假设一个函数可以有 1 或 2 个输出参数:

try 
  [a, b] = f(x)
catch
  a = f(x)
end

当然可以对任意数量的输出参数执行此操作,但您真的不想这样做。

【讨论】:

    猜你喜欢
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多