Векторизация функции в Matlab - PullRequest
0 голосов
/ 12 октября 2019

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

function [val] = clenshaw(coeffs,x)


b=zeros(1,length(coeffs)+2);

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;

Цель этой функции - использовать алгоритм Кленшоу для вычисления значения одного полинома скоэффициенты "коэффи" в точке х. Он отлично работает, когда x - одно значение, но я бы хотел, чтобы он работал и с вектором аргументов. Когда я пытаюсь передать вектор, я получаю ошибку:

Unable to perform assignment because the left
and right sides have a different number of
elements.

Error in clenshaw (line 7)
   b(k)=coeffs(k)-b(k+2)+2*b(k+1).*x;

Я понимаю, что есть проблема, потому что я пытаюсь присвоить вектор скалярной переменной b (k). Я попытался сделать матрицу ba вместо вектора, однако я все еще не могу получить возвращаемый результат, который я хотел бы получить, который был бы вектором значений этой функции в точках вектора x.

Спасибо за помощьи извините, если что-то не совсем понятно, потому что английский не мой родной язык.

1 Ответ

1 голос
/ 12 октября 2019

Векторизованная версия вашей функции выглядит следующим образом:

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

Однако первая версия возвращает вектор столбца, а вторая - вектор строки. Поэтому вам может понадобиться транспонировать результат, если важен тип вектора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...