【问题标题】:MATLAB Return value of first non-empty argument (built-in COALESCE function)MATLAB 第一个非空参数的返回值(内置 COALESCE 函数)
【发布时间】:2015-09-13 19:45:45
【问题描述】:

MATLAB 中是否有与SQL COALESCE 函数类似的内置功能。我希望该函数从所有参数中返回第一个“现有”值。
例如,

clear A B; C=10; COALESCE(A,B,C)

应该返回C 的值(因为AB 未分配/不存在)。
我知道编写代码很容易,我只是在这里偷懒。但是,如果 MATLAB 没有类似的功能,我会感到惊讶。

【问题讨论】:

    标签: matlab function coalesce


    【解决方案1】:

    据我所知,没有内置函数。但您可以轻松编写自己的代码。

    请注意,在 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 个样本,1'000'000 次迭代,3 个变量和 20 个变量)

    【讨论】:

    • 当然,它也适用于向量和矩阵。
    猜你喜欢
    • 2021-08-23
    • 2017-09-02
    • 2021-07-04
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多