【问题标题】:What exactly does a multi-output function in Matlab return?Matlab 中的多输出函数究竟返回了什么?
【发布时间】:2014-12-30 07:37:56
【问题描述】:

免责声明:我实际上使用的是 Scilab,但它与 MATLAB 非常相似,根据我的研究,似乎 MATLAB 也会出现同样的现象。

在 MATLAB 中,函数可以是多输出的。假设我们有一个函数function [a, b] = f(x)。如果我输入:

c = f(x)

然后c 被赋予第一个输出的值。如果我输入:

[a, b] = f(x)

然后[a, b] 被赋予两个输出对的值。这似乎暗示 MATLAB 没有referential transparency。表达式f(x) 的实际值是多少?怎么回事?

【问题讨论】:

  • 是的,Matlab 不是参照透明的。否则,您可以索引函数的结果。我认为这是为了让编程“更容易”,因为有些函数的第二和第三输出“不太重要”。

标签: matlab function scilab referential-transparency multiple-variable-return


【解决方案1】:

在某些情况下,请求输出的数量会改变行为,尤其是在调用没有输出参数的函数时。

例如,这只是使用默认设置绘制a 中数据的直方图:

hist(a);

接下来将直方图数据返回到N。没有产生任何情节:

N = hist(a);

但是,如果我们要求两个输出(X 现在是 bin 中心),我们可以用bar 绘制直方图(如果没有给出输出参数,hist 在内部使用它来绘制):

[N, X] = hist(a);
bar(X,N);

此行为通过检查nargout 来控制,并且可以合并到您自己的函数中。

【讨论】:

  • 这很有道理!刚刚在其他解决方案上对此发表了评论。
  • 第一种情况我们有nargout=0,第二种情况有nargout=1,第三种情况有nargout=2?
  • @JackM 和[N, ~] = hist(a); 也会有nargout 作为2
【解决方案2】:

表示函数f(x)正常返回2个输出。但是,当仅使用一个输出参数调用时,它将仅返回第一个(在您的情况下为a)。在 MATLAB 中,您还可以使用 ~ 指定您对特定输出不感兴趣:

[~,b] = f(x);
[a,~] = f(x); % equivalent to a = f(x)

【讨论】:

  • 所以基本上在 matlab 中你不会“调用函数”,而是“调用特定输出集的函数”?
  • 嗯,这是语义上的。在 MATLAB 中,您“调用一个函数”,它返回一个或多个输出(或者有时不返回,具体取决于函数)。您可以在函数体中使用nargout 来确定调用了多少个输出参数以及返回什么。见mathworks.co.uk/help/matlab/matlab_prog/…
  • 嗯,第一个输出并不总是等价于唯一的输出情况。例如,当您使用idx = find() 时,idx 将为您提供线性索引。但是,如果你这样做 - [idx,~] = find()idx 将是行索引。大多数 MATLAB 内置函数使用 nargout(您刚才提到的)来检测并相应地输出值。 nargout 将是 2 与这两者 - [a,b] = some_func1[a,~] = some_func1,这就是我认为 MATLAB 用来决定输出什么的。
  • @Divakar 感谢您的评论,nkjt 的回答很好地说明了这一点。
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-15
  • 2017-05-06
  • 2016-04-21
相关资源
最近更新 更多