Matlab中函数的矢量化
我试图在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
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。但是,如果它是正确的解决方案,您可以将其标记为已接受的答案。