MATLAB第一个非空参数的返回值(内置COALESCE函数)

3
MATLAB是否有类似于SQL COALESCE函数的内置功能?我想要该函数从所有参数中返回第一个“已存在”的值。
例如,
clear A B; C=10; COALESCE(A,B,C)

应该返回C的值(因为AB没有被赋值/不存在)。
我知道编写这个很容易,但是我在这里有点懒。但是,如果MATLAB没有类似的函数,我会感到惊讶。

1个回答

0
据我所知,Matlab没有内置的函数可以实现这个功能。但是你可以很容易地编写自己的函数。
请注意,在Matlab中,不可能传递一个在使用之前未定义的变量。因此,你提出的调用clear A B; C=10; COALESCE(A,B,C)是无效的,并会抛出错误。相反,我们可以使用var=[]定义一个空变量。
以下代码创建了两个空变量AB并将C=10赋值给它们。在函数coalesce中,我们假设所有变量一开始都是空的。在for循环中,我们返回第一个非空变量。在没有for循环的版本中,我们获取第一个非零元素的索引,然后如果存在非零元素,则返回单元格的相应内容。
如果你想让该函数在Matlab中的任何地方都可用,请参阅文档here
function testcoalesce
    A = [];
    B = [];
    C = 10;
    COALESCE(A,B)
    COALESCE(A,B,C)
end

% with for-loop (much faster)
function out = COALESCE(varargin)
    out = [];
    for i = 1:length(varargin)
       if ~isempty(varargin{i})
           out = varargin{i};
           return;
       end
    end
end

% without for-loop (slower)
function out = COALESCE(varargin)
    out = [];
    ind = find(cellfun('isempty', varargin)==0, 1);
    if ~isempty(ind); 
        out = varargin{ind};
    end
end

输出结果如预期:

ans =
     []
ans =
    10

计时两个函数后发现,使用for循环的第一个解决方案比没有循环的函数快约48%。
(10个样本,100万次迭代,3个变量和20个变量)

当然,它也适用于向量和矩阵。 - Matt

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