MATLAB оптимизирует соответствующие вызовы функций - PullRequest
1 голос
/ 09 июля 2020

У меня есть трехмерный массив измерений (строк x столбцов x 8). Для каждого элемента в первых двух измерениях у меня есть 8 значений по третьему измерению, которые я должен соответствовать уравнению, например экспоненциальному, полиномиальному и т. Д. c. Я написал код для этой функции, и в настоящее время производю вывод, перебирая первые два измерения следующим образом:

for i=1:rows
    for j=1:cols
        outputArray(i,j) = functionHandle(inputArray(i,j,1:8));
    end
end

Могу ли я каким-то образом использовать bsxfun, arrayfun или какой-либо другой метод векторизации для избавиться от циклов for, чтобы генерировать вывод, используя что-то вроде этого?

outputArray = bsxfun(@functionHandle,inputArray)

Добавление functionHandle

function output = functionHandle(xData,yData)
    ft = fittype( 'a*exp(-b*x)+c','independent', 'x','dependent','y' );
    opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
    opts.Algorithm = 'Trust-Region';
    opts.Display = 'Off';
    opts.MaxFunEvals = 100;
    opts.MaxIter = 100;
    opts.Robust = 'LAR';
    opts.Lower = [-Inf 0 -Inf];
    opts.StartPoint = [0.35 0.05 0.90];

    % Fit model to data.
    [FitResult,~] = fit(xData,yData,ft,opts);
    output = FitResult.a;
end

1 Ответ

0 голосов
/ 10 июля 2020

Ответ полностью зависит от того, векторизована ваша функция или нет. Что вам нужно сделать, так это написать эту функцию так, чтобы она позволяла вводить R × C × 8 и выдавала R × C × N вывод, где N - количество подходящих параметров.

То есть векторизация должна выполняться внутри функции; это невозможно сделать снаружи. Снаружи вы можете использовать функцию только в al oop. Обратите внимание, что arrayfun аналогичен и имеет сопоставимую производительность с for l oop.

Поскольку ваша функция в основном использует fit, похоже, вы не можете векторизовать, потому что fit принимает один набор входов за раз и производит соответствующий выход.

...