MATLAB Возвращаемое значение первого непустого аргумента (встроенная функция COALESCE)

Есть ли что-то встроенное в MATLAB, которое работает аналогично функции SQL COALESCE. Я хочу, чтобы эта функция возвращала первое «существующее» значение из всех аргументов.
Например,

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

должно возвращать значение C (поскольку A и B не назначены/не существуют).
Я знаю, что это будет очень легко закодировать, и я просто ленив здесь. Но я был бы удивлен, если бы в MATLAB не было подобной функции.


person tumchaaditya    schedule 26.06.2015    source источник


Ответы (1)


Насколько я знаю, встроенной функции для этого нет. Но вы можете легко написать свой собственный.

Обратите внимание, что в Matlab невозможно передать переменную, которая не была определена до ее использования. Поэтому предложенный вами вызов clear A B; C=10; COALESCE(A,B,C) недействителен и вызовет ошибку. Вместо этого мы можем определить пустую переменную, используя var=[].

Следующий код создает две пустые переменные A, B и присваивает C=10. Внутри функции coalesce мы вначале предполагаем, что все переменные пусты. В цикле for мы возвращаем первую непустую переменную. В версии без цикла for мы получаем индекс первого ненулевого элемента, а затем возвращаем соответствующее содержимое ячейки, если ненулевой элемент существует.

Если вы хотите, чтобы функция была доступна из любой точки Matlab, см. документацию здесь.

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 переменных)< / суп>

person Matt    schedule 26.06.2015
comment
Конечно, он работает и с векторами, и с матрицами. - person Matt; 14.11.2015