首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >返回变量Matlab和Python?

返回变量Matlab和Python?
EN

Stack Overflow用户
提问于 2018-07-19 03:29:01
回答 1查看 220关注 0票数 0

我正在尝试将一些代码从Matlab翻译成Python。我的函数(在Matlab中)的开始如下所示:

代码语言:javascript
复制
function [varargout]=hysime(varargin);
    error(nargchk(3, 4, nargin))
    if nargout > 2, error('too many output parameters'); end
    verbose = 1; % default value
    y = varargin{1}; % 1st parameter is the data set

在程序的后面会有类似这样的东西:

代码语言:javascript
复制
n = varargin{2}; % the 2nd parameter is the noise
Rn = varargin{3}; % the 3rd parameter is the noise correlation matrix

if nargin == 4, verbose = ~strcmp(lower(varargin{4}),'off');end

最后是这样的:

代码语言:javascript
复制
varargout(1) = {kf};
if nargout == 2, varargout(2) = {Ek};end
return 

我对这段代码的含义感到非常困惑。一方面,我知道所有输入的参数都需要返回。然而,在程序结束时,似乎只返回2个变量(而我们输入3?)。我如何翻译这段代码,以便返回必要的参数?我想我在这里最大的问题是matlab代码让代理输入参数,但是它们看起来不都是必需的?看起来不能有两个以上的输出?我只是很难理解这里的每一行代码的含义。有没有人能解释一下matlab代码是怎么回事,以及我能做些什么来在python中实现同样的功能?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-19 04:01:40

短版

MATLAB代码应该是这样编写的:

代码语言:javascript
复制
function [kf, Ek]=hysime(y, n, Rn, verbose);
    error(nargchk(3, 4, nargin))
    if nargin < 4
        verbose = true;
    else
        verbose = ~strcmpi(verbose ,'off');
    end

如果你了解MATLAB,这应该会更清楚。(大部分)对应的Python代码可以写成这样:

代码语言:javascript
复制
def hysime(y, n, Rn, verbose=True):
    # rest of the function here
    return kf, Ek

长版本

此函数需要3个或4个输入参数,如果没有提供第四个参数,则会设置默认值。然而,它是以一种比它需要的方式复杂得多的方式完成的(尽管我经常看到这种模式)。理想情况下,在MATLAB中,您应该指定相同的内容,如下所示:

代码语言:javascript
复制
function [varargout]=hysime(y, n, Rn, verbose)
    error(nargchk(3, 4, nargin))
    if nargin < 4
        verbose = true;
    else
        verbose = ~strcmpi(verbose ,'off');
    end

因此,它所做的是将第一个参数放入变量y,将第二个参数放入变量n,将第三个参数放入Rn,如果指定了第四个参数,则将其放入verbose (基于它与字符串'off'的比较),否则将verbose设置为true

在python中,可选参数的处理是内置的。您可以通过设置name=value来为函数定义中的参数指定默认值,其中name是参数名称,value是默认值。此外,由于历史原因,MATLAB经常使用'on''off'而不是truefalse。在Python语言中几乎不会这样做,人们只使用TrueFalse。因此,您可以在Python中指定相同的内容,如下所示:

代码语言:javascript
复制
def hysime(y, n, Rn, verbose=True):

这使得ynRn参数是必需的,但verbose是可选的。

这不能处理将verbose设置为字符串'off'的情况。正如我所说的,由于历史原因,这在MATLAB中很常见,但当您可以避免它时,您真的不应该再在MATLAB中这样做了,而且您绝对不应该在Python中这样做。但是如果你真的真的需要处理这种情况,你可以这样做:

代码语言:javascript
复制
def hysime(y, n, Rn, verbose=True):
    if isinstance(verbose, str):
        verbose = verbose.lower() != 'off'

对于输出,MATLAB代码的作用是让函数返回一个或两个值。所以有人可以这样做:

代码语言:javascript
复制
kf = hysime(y, n, Rn);

代码语言:javascript
复制
[kf, Ek] = hysime(y, n, Rn);

然而,这也是以一种比必要的更复杂的方式来完成的。如果只返回两个值,并且只使用一个返回值,则MATLAB将丢弃其余的返回值。因此,该函数可以只返回[kf, Ek],而不是在MATLAB上胡乱操作,MATLAB也会做同样的事情。如果有人尝试调用具有2个以上输出的函数,则会自动出现错误,因此这也是不必要的。

只有当您希望程序根据输出的数量改变其行为时,才需要以这种方式处理varargout。在这种结构中,你这样做的主要原因是如果eK的计算成本很高,在这种情况下,你会这样做:

代码语言:javascript
复制
varargout(1) = {kf};
if nargout == 2
    # calculate eK here
    varargout(2) = {Ek};
end

至于return,只有在MATLAB中,如果你想使函数在正常到达结束之前提前停止,才需要它。一旦它正常到达末尾,它将自动return。因此,如果您指定的最后一段代码是函数的末尾,那么return就是多余的。

因此,您在MATLAB中显示的所有代码都可以简化为:

代码语言:javascript
复制
function [kf, Ek]=hysime(y, n, Rn, verbose);
    error(nargchk(3, 4, nargin))
    if nargin < 4
        verbose = true;
    else
        verbose = ~strcmpi(verbose ,'off');
    end

至于Python,正如我在other answer to you中提到的,Python需要处理所有返回值。除非您显式地告诉它,否则它永远不会抛出返回值。在您的例子中,最简单的解决方案就是在函数的末尾使用return kf, Ek。如果有人同时想要kfEk,他们可以这样做:

代码语言:javascript
复制
kf, Ek = hysime(y, n, Rn)

如果他们只想要kf,他们可以这样做(其中_是您不关心的变量的python约定):

代码语言:javascript
复制
kf, _ = hysime(y, n, Rn)

或者:

代码语言:javascript
复制
kf = hysime(y, n, Rn)[0]

所以python代码应该是:

代码语言:javascript
复制
def hysime(y, n, Rn, verbose=True):
    # rest of the function here
    return kf, Ek

如果您真的希望能够有一个或两个返回值,则需要使用另一个参数来更改行为。例如:

代码语言:javascript
复制
def hysime(y, n, Rn, verbose=True, ret_eK=False):
    # rest of the function here
    return (kf, Ek) if ret_eK else kf

因此,在本例中,如果指定了ret_eK参数并将其设置为True,则返回kf, Ek,否则仅返回kf。但是在Python中,您并不想这样做,除非有一些主要的额外成本来计算Ek,在本例中似乎不是这样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51409685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档