Векторизованная версия вашей функции выглядит следующим образом:
function [val] = clenshaw(coeffs,x)
b=zeros(length(x),length(coeffs)+2);
for k=length(coeffs):-1:2
b(:,k)=coeffs(k)-b(:,k+2)+2*b(:,k+1).*transpose(x);
end
val=coeffs(1)-b(:,3)+b(:,2).*transpose(x);
end
b
должна быть матрицей. В вашем цикле вы должны выполнять каждую операцию для строки b
. Поэтому вам нужно написать b(:,k)
вместо b(k)
. Так как b(:,k)
является вектором, а не скаляром, вы также должны быть осторожны с размерами при использовании оператора .*
. Чтобы получить правильные результаты, вам нужно транспонировать x
. То же самое относится и к расчету val
. Если вам не нравится транспонирование, просто поменяйте местами строки и столбцы b, и вы получите следующее:
function [val] = clenshaw(coeffs,x)
b=zeros(length(coeffs)+2, length(x));
for k=length(coeffs):-1:2
b(k,:)=coeffs(k)-b(k+2,:)+2*b(k+1,:).*x;
end
val=coeffs(1)-b(3,:)+b(2,:).*x;
end
Однако первая версия возвращает вектор столбца, а вторая - вектор строки. Поэтому вам может понадобиться транспонировать результат, если важен тип вектора.