Я сталкиваюсь с серьезными проблемами производительности анонимных функций в matlab 2011a, где накладные расходы, вносимые анонимной контейнерной функцией, намного больше, чем время, затрачиваемое самой вложенной функцией.
Я прочитал пару связанных вопросов, в которых пользователи услужливо объяснили, что это проблема, с которой сталкиваются другие, показывая, что я могу значительно повысить производительность, покончив с анонимными контейнерами. К сожалению, мой код структурирован таким образом, что я не уверен, как это сделать, не ломая много вещей.
Итак, есть ли обходные пути для повышения производительности анонимных функций без полного их устранения или шаблонов проектирования, которые позволили бы мне избавиться от них, не раздутый код и не тратить много времени на рефакторинг?
Некоторые детали, которые могут помочь:
Ниже приведен набор анонимных функций, которые хранятся в виде свойства класса. Использование массива int, который, в свою очередь, используется оператором switch, может в принципе заменить массив, но содержимое GP может быть изменено - есть другие функции с такой же структурой аргументов, что и для traingps, которые можно использовать там, и В некоторых случаях содержание GP может быть определено во время выполнения.
m3.GPs = {@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[1 0]');
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[-1 1]');
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,2,params,0);
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,3,params,0);
@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,4,params,[0 0 0]')};
Позже элементы GP вызываются функцией-членом класса, например:
GPt = GPs{t(j)}(xj,yj,gridX(xi),thetaT(1),thetaT(2:end));
Согласно профилировщику, время автономной работы анонимной оболочки занимает 95% от общего времени (1,7 секунды для 44 вызовов!) Против 5% для содержащейся функции. Я использую аналогичный подход в другом месте, где стоимость анонимной оболочки еще больше, пропорционально говоря.
Есть ли у кого-нибудь мысли о том, как сократить накладные расходы на анонимные вызовы или, при отсутствии таковых, как заменить анонимную функцию, сохраняя при этом гибкость, которую они предоставляют (и не вводя кучу дополнительных счетов и передачи аргументов)?
Спасибо!