我正在尝试将一些代码从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中实现同样的功能?
谢谢!
发布于 2018-07-19 04:01:40
短版
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'
的比较),否则将verbose
设置为true
。
在python中,可选参数的处理是内置的。您可以通过设置name=value
来为函数定义中的参数指定默认值,其中name
是参数名称,value
是默认值。此外,由于历史原因,MATLAB经常使用'on'
和'off'
而不是true
和false
。在Python语言中几乎不会这样做,人们只使用True
和False
。因此,您可以在Python中指定相同的内容,如下所示:
def hysime(y, n, Rn, verbose=True):
这使得y
、n
和Rn
参数是必需的,但verbose
是可选的。
这不能处理将verbose
设置为字符串'off'
的情况。正如我所说的,由于历史原因,这在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将丢弃其余的返回值。因此,该函数可以只返回[kf, Ek]
,而不是在MATLAB上胡乱操作,MATLAB也会做同样的事情。如果有人尝试调用具有2个以上输出的函数,则会自动出现错误,因此这也是不必要的。
只有当您希望程序根据输出的数量改变其行为时,才需要以这种方式处理varargout
。在这种结构中,你这样做的主要原因是如果eK
的计算成本很高,在这种情况下,你会这样做:
varargout(1) = {kf};
if nargout == 2
# calculate eK here
varargout(2) = {Ek};
end
至于return
,只有在MATLAB中,如果你想使函数在正常到达结束之前提前停止,才需要它。一旦它正常到达末尾,它将自动return
。因此,如果您指定的最后一段代码是函数的末尾,那么return
就是多余的。
因此,您在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
至于Python,正如我在other answer to you中提到的,Python需要处理所有返回值。除非您显式地告诉它,否则它永远不会抛出返回值。在您的例子中,最简单的解决方案就是在函数的末尾使用return kf, Ek
。如果有人同时想要kf
和Ek
,他们可以这样做:
kf, Ek = hysime(y, n, Rn)
如果他们只想要kf
,他们可以这样做(其中_
是您不关心的变量的python约定):
kf, _ = hysime(y, n, Rn)
或者:
kf = hysime(y, n, Rn)[0]
所以python代码应该是:
def hysime(y, n, Rn, verbose=True):
# rest of the function here
return 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
参数并将其设置为True
,则返回kf, Ek
,否则仅返回kf
。但是在Python中,您并不想这样做,除非有一些主要的额外成本来计算Ek
,在本例中似乎不是这样。
https://stackoverflow.com/questions/51409685
复制相似问题