Matlab中与Python的“None”相当的内容

9

在Matlab中,是否有与Python中None大致等价的关键字?

我正在尝试将其用于标记函数的可选参数。我正在翻译以下Python代码:

def f(x,y=None):
    if y == None:
        return g(x)
    else:
        return h(x,y)

转换为Matlab

function rtrn = f(x,y)
    if y == []:
        rtrn = g(x);
    else
        rtrn = h(x,y);
    end;
end

目前,我正在使用[]代替None。有更好的方法吗?


2
你在Matlab中想要做什么? - Will Robertson
4个回答

12
在你的特定情况下,你可以使用 nargin 来确定在调用该函数时提供了多少个输入参数。
MATLAB文档中得知:
nargin 和 nargout 函数使您能够确定函数被调用时提供了多少个输入和输出参数。 然后,您可以使用条件语句根据参数数量执行不同的任务。 例如,
function c = testarg1(a, b) 
     if (nargin == 1)
         c = a .^ 2; 
     elseif (nargin == 2)
         c = a + b; 
     end

这个函数接受一个参数,如果只提供一个参数,则将该参数平方。如果提供两个参数,则将它们相加。


2
我还会在if循环中添加另一个else步骤,以捕获函数被调用时输入参数数量不正确的情况,然后将其标记为错误。 - Adrian

12

NaN虽然不等同,但通常用于类似的目的。


1
NaN在Python中与None的作用不同。NaN表示数字计算中发生了错误。它是一个可以用作“未给定”标志的值,但是0[]{}'none'或任何其他你想选择的值也可以。在MATLAB中,等效于传递None的方法是根本不传递值,这可以通过本页面的其他答案中所示的方式进行检测。 - Cris Luengo

7

nargin是最简单的方法。通常最好使用nargchk来验证输入参数的数量:

function e = testFunc(a,b,c,d)
    error( nargchk(2, 4, nargin, 'struct') );

    % set default values
    if nargin<4, d = 0; end
    if nargin<3, c = 0; end

    % ..
    c = a*b + c*d;

end

...它作为一种确保传递正确数量的参数的方法。在这种情况下,至少需要两个参数,最多需要四个

如果nargchk没有检测到错误,则执行将正常恢复,否则将生成一个错误。例如,调用testFunc(1)将生成:

Not enough input arguments.

UPDATE: A new function was introduced in R2011b narginchk, which replaces the use of the deprecated nargchk+error seen above:

narginchk(2,4);
您可以使用像existisempty这样的函数来检查变量是否存在以及它是否为空:
if ~exist('c','var') || isempty(c)
  c = 10;
end

这让你可以像这样调用函数:testFunc(1,2,[],4),它会使用默认值c,但仍然提供d的值。

您也可以使用varargin接受可变数量的参数。

最后,一种解析和验证命名输入的强大方法是使用inputParser

要查看传递参数和设置默认值的其他示例和替代方案,请查看此文章及其评论。


2
从那时起,引入了一个新的函数narginchk,它取代了上面所见的已弃用的nargchk+error的使用。 - Amro

2

在MATLAB中,相当于Python的None的是string(missing)

为了测试,请在命令窗口中输入以下内容:py.type( string(missing) )

它将返回<class 'NoneType'>

MATLABPython数据类型文档在这里

如果你想要将None传递给从MATLAB调用的Python函数,那么你需要传入string(missing)。例如,如果你正在检测None,比如if arg1 == None,那么这个参数会显示为None


1
但是string(missing)是一个1x1字符串数组,不完全等同于None。例如,Python中的len(None)会出错,而在MATLAB中,length(string(missing))为1。isempty(string(missing))为假,并且您无法转换为布尔值(Python中的if None:有效,而在MATLAB中的if string(missing)无效)。 - Cris Luengo
我明白你的意思,但是在我的一些Python函数中,我会检测一些参数是否为None,并相应地采取行动。如果我想在从Matlab调用函数时传递None以指示其中一种条件,那么我可以使用string(missing)来实现。MATLAB文档:https://www.mathworks.com/help/matlab/matlab_external/passing-data-to-python.html - geekygeek
那是一个非常好的观点! - Cris Luengo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接