【发布时间】:2015-09-13 19:45:45
【问题描述】:
MATLAB 中是否有与SQL COALESCE 函数类似的内置功能。我希望该函数从所有参数中返回第一个“现有”值。
例如,
clear A B; C=10; COALESCE(A,B,C)
应该返回C 的值(因为A 和B 未分配/不存在)。
我知道编写代码很容易,我只是在这里偷懒。但是,如果 MATLAB 没有类似的功能,我会感到惊讶。
【问题讨论】:
MATLAB 中是否有与SQL COALESCE 函数类似的内置功能。我希望该函数从所有参数中返回第一个“现有”值。
例如,
clear A B; C=10; COALESCE(A,B,C)
应该返回C 的值(因为A 和B 未分配/不存在)。
我知道编写代码很容易,我只是在这里偷懒。但是,如果 MATLAB 没有类似的功能,我会感到惊讶。
【问题讨论】:
据我所知,没有内置函数。但您可以轻松编写自己的代码。
请注意,在 Matlab 中不可能传递在使用之前尚未定义的变量。因此,您提议的调用 clear A B; C=10; COALESCE(A,B,C) 无效并且会引发错误。相反,我们可以使用var=[] 定义一个空变量。
下面的代码创建了两个空变量A、B 和赋值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 个变量)
【讨论】: