代码之家  ›  专栏  ›  技术社区  ›  A.Torres

返回变量Matlab和Python?

  •  0
  • A.Torres  · 技术社区  · 6 年前

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

    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
    

    在程序的后面有这样的内容:

    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
    

    最后是这样的:

    varargout(1) = {kf};
    if nargout == 2, varargout(2) = {Ek};end
    return 
    

    我对这段代码的含义感到非常困惑。一方面,我知道输入的参数都需要返回然而,在程序结束时,似乎只有2个变量将被返回(而我们输入3?)。如何翻译此代码以便返回必要的参数我想我这里最大的问题是,Matlab代码允许代理输入参数,但它们似乎并不都是必需的?似乎不能有两个以上的输出我只是在破解每一行代码的含义时遇到了困难有人能解释一下Matlab代码发生了什么,以及我能做些什么来在Python中实现同样的功能吗?

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  2
  •   TheBlackCat    6 年前

    短版

    MATLAB代码应该是这样写的:

    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代码可以这样编写:

    def hysime(y, n, Rn, verbose=True):
        # rest of the function here
        return kf, Ek
    

    长版

    此函数需要3或4个输入参数,如果未提供第四个参数,则设置默认值然而,它的实现方式比需要的复杂得多(尽管我经常看到这种模式)。理想情况下,在Matlab中,您可以指定类似的内容:

    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' ),否则设置 冗长的 true .

    在python中,可选参数的处理是内置的。可以通过设置 name=value ,其中 name 是参数名和 value 是默认值另外,出于历史原因,Matlab经常使用 'on' '关闭' 而不是 真的 false 是的。这在python中几乎从来没有实现过,人们只是使用 True False 是的。所以您可以在python中指定相同的内容,如下所示:

    def hysime(y, n, Rn, verbose=True):
    

    这使得 是的 , n个 ,和 注册护士 必需的参数,但是 冗长的 可选择。

    这不适用于 冗长的 设置为字符串 '关闭' . 正如我所说,由于历史原因,这在Matlab中很常见,但是如果可以避免的话,您真的不应该再在Matlab中这样做了,而且您绝对不应该在Python中这样做。但如果你真的真的需要处理这个案子,你可以做:

    def hysime(y, n, Rn, verbose=True):
        if isinstance(verbose, str):
            verbose = verbose.lower() != 'off'
    

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

    kf = hysime(y, n, Rn);
    

    或者

    [kf, Ek] = hysime(y, n, Rn);
    

    然而,这样做的方式也比必要的复杂。如果只返回两个值,并且只使用一个返回值,则Matlab将丢弃其余的值。所以不要胡闹 varargout ,函数可以返回 [kf, Ek] 而MATLAB也会做同样的事情如果有人试图调用具有两个以上输出的函数,则会自动发生错误,因此这也是不必要的。

    处理 瓦拉戈 只有当您希望程序根据输出的数量更改其行为时,才需要这样做。在这种结构中,您这样做的主要原因是 eK 计算起来很昂贵,在这种情况下,你会做这样的事情:

    varargout(1) = {kf};
    if nargout == 2
        # calculate eK here
        varargout(2) = {Ek};
    end
    

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

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

    函数[kf,ek]=hytime(y,n,rn,verbose);
    错误(nargchk(3,4,nargin))
    如果nargin<4
    verbose=true;
    其他的
    verbose=~strcmpi(verbose,'off');
    结束
    

    至于python,正如我在 other answer to you ,Python要求处理所有返回值除非您明确告诉它,否则它永远不会丢弃返回的值对你来说,最简单的解决方法就是 return kf, Ek 在函数的末尾如果有人两者都想要 kf Ek ,他们可以:

    kf, Ek = hysime(y, n, Rn)
    

    如果他们只想 肯德基 ,他们可以(在 _ 是您不关心的变量的python约定):

    kf, _ = hysime(y, n, Rn)
    

    或:

    kf = hysime(y, n, Rn)[0]
    

    所以python代码是:

    定义时间(y,n,rn,verbose=true):
    #函数的其余部分
    返回kf,Ek
    

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

    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 参数已指定并设置为 真的 ,然后 kf, Ek 被退回,否则就 肯德基 被退回但是在Python中,除非有一些额外的计算成本,否则您真的不想这样做 埃克 ,这在本例中似乎不存在。