Matlab 中函数的向量化

Vectorization of function in Matlab

我试图在 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;

此函数的目的是使用 Clenshaw 算法计算一个多项式在点 x 处的系数 "coeffs" 的值。 当 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)。 我尝试将 b 设为矩阵而不是向量,但是我仍然无法获得我想要的 return 输出,它是向量 x.

点处此函数值的向量

感谢您的帮助,如果有什么地方不是很清楚,我们深表歉意,因为英语不是我的母语。

您的函数的矢量化版本如下所示:

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) 是向量而不是标量,因此在使用 .* 运算符时还必须注意维度。要得到正确的结果,需要转置xval的计算也是如此。如果您不喜欢换位,只需交换 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

但是,第一个版本 returns 是一个列向量,第二个版本是一个行向量。因此,如果矢量类型很重要,您可能需要转置结果。