Matlab中函数的矢量化

Matlab中函数的矢量化,matlab,function,vectorization,Matlab,Function,Vectorization,我试图在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处为“coefs

我试图在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处为“coefs”。 当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变成一个矩阵而不是向量,但是我仍然无法得到我想要的返回输出,它是这个函数在向量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)
是一个向量而不是标量,因此在使用
*
运算符时,还必须小心标注。要获得正确的结果,需要将
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

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

如果使用
*
运算符,x是向量,则结果也是向量,正如您自己所说。所以你需要在左手边有一个矩阵。但是,您需要告诉Matlab行和列是应该写入结果的。现在无法测试它,必须重新安装matlab,但它应该是这样工作的
b(k,:)=…
我刚刚添加了一个完整的答案。不幸的是,我太晚了,你已经解决了你的问题:p。但是,如果它是正确的解决方案,您可以将其标记为已接受的答案。