Matlab中的多输出函数究竟返回什么?

Matlab中的多输出函数究竟返回什么?,matlab,function,scilab,referential-transparency,multiple-variable-return,Matlab,Function,Scilab,Referential Transparency,Multiple Variable Return,免责声明:我实际上使用的是Scilab,但它与MATLAB非常相似,根据我的研究,MATLAB似乎也存在同样的现象 在MATLAB中,函数可以是多输出的。假设我们有一个函数函数[a,b]=f(x)。如果我键入: c = f(x) [a, b] = f(x) 然后c被赋予第一个输出的值。如果我键入: c = f(x) [a, b] = f(x) 然后,[a,b]给出两个输出对的值。这似乎意味着MATLAB没有。表达式f(x)的实际值是多少?发生了什么?这意味着函数f(x)通常返回2个输出。

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

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

c = f(x)
[a, b] = f(x)
然后
c
被赋予第一个输出的值。如果我键入:

c = f(x)
[a, b] = f(x)

然后,
[a,b]
给出两个输出对的值。这似乎意味着MATLAB没有。表达式
f(x)
的实际值是多少?发生了什么?

这意味着函数
f(x)
通常返回2个输出。但是,当只使用一个输出参数调用时,它将只返回第一个参数(
a
)。在MATLAB中,您还可以使用
~
指定您对特定输出不感兴趣:

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

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

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

hist(a);
下一步将直方图数据返回到
N
。未生成任何绘图:

N = hist(a);
但是,如果我们要求两个输出(
X
现在是bin中心),我们可以用
bar
绘制柱状图(如果没有给出输出参数,
hist
在内部使用柱状图进行绘制):


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

是的,Matlab不是参考透明的。否则,您可以为函数的结果编制索引。我认为这是为了使编程“更容易”,因为有些函数具有“不太重要”的东西作为第二和第三输出。所以基本上在matlab中,你不“调用函数”,而是“为一组特定的输出调用函数”?嗯,这是语义。。在MATLAB中,您可以“调用一个函数”,该函数返回一个或多个输出(有时无输出,具体取决于函数)。您可以在函数体中使用
nargout
,以确定调用了多少输出参数以及返回什么。看,第一个输出并不总是等同于唯一的输出情况。例如,当您使用
idx=find()
时,
idx
将为您提供线性索引。但是,如果您这样做-
[idx,~]=find()
idx
将是行索引。大多数MATLAB内置函数使用
nargout
(您刚才提到过)来检测并相应地输出值
nargout
将是
2
和这两个-
[a,b]=some_func1
[a,~]=some_func1
,这就是我认为MATLAB用来决定输出的内容。@Divakar感谢您的评论,nkjt的回答很好地说明了这一点。这很有意义!刚才在另一个解决方案中对此进行了评论。在第一种情况下,我们有
nargout=0
,第二种情况是
nargout=1
,第三种情况是
nargout=2
?@JackM和
[N,~]=hist(a)
也将具有
nargout
作为
2