Самый быстрый способ, вероятно, оценивать различные полиномы напрямую, удаляя петлю (как показано obchardon или Luis ).Тем не менее, вот примечание о polyval
производительности ...
Если вы введете edit polyval
в командном окне, вы увидите источник функции polyval
.В частности, в верхней части приведена следующая условная оценка:
nc = length(p);
if isscalar(x) && (nargin < 3) && nc>0 && isfinite(x) && all(isfinite(p(:)))
% Make it scream for scalar x. Polynomial evaluation can be
% implemented as a recursive digital filter.
y = filter(1,[1 -x],p);
y = y(nc);
return
end
Я думаю, что комментарий "Make it scream"
является разработчиком (-ями), который говорит нам, что это очень быстрый путь через функцию!В сторону;это также лучший комментарий, который я нашел во встроенном в MATLAB.
Итак, давайте попробуем удовлетворить условия для этого if
оператора ...
✓ isscalar(x)
✓ nargin < 3
✓ length(p) > 0
✓ isfinite(x)
✓ all(isfinite(p(:)))
Бриллиант, такэто всегда оценка, которую вы используете.Вы можете найти улучшения в скорости, удалив эти 5 проверок и просто сделав это вместо polyval
.С точки зрения ваших переменных это выглядит так:
y = filter(1,[1 -x(index)],poly_objective(index,:));
polyvalue (index) = y(size(poly_objective,2));
% Note you should get size(poly_objective,2) outside your loop