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)
是向量而不是标量,因此在使用 .*
运算符时还必须注意维度。要得到正确的结果,需要转置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
但是,第一个版本 returns 是一个列向量,第二个版本是一个行向量。因此,如果矢量类型很重要,您可能需要转置结果。
我试图在 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)
是向量而不是标量,因此在使用 .*
运算符时还必须注意维度。要得到正确的结果,需要转置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
但是,第一个版本 returns 是一个列向量,第二个版本是一个行向量。因此,如果矢量类型很重要,您可能需要转置结果。