我正在尝试生成Laguerre多项式,然后在坐标数组上逐元素地计算它们。
目前我的代码看起来像是:
[X,Y] = meshgrid(x_min:mesh_size:x_max,y_min:mesh_size:y_max);
const_p=0;
const_l=1; %At present these two values don't really matter, any integer will do
coord_r = sqrt(X.^2 + Y.^2)
lag_input = num2str(coord_r.^2)
u_pl = evalin(symengine,['orthpoly::laguerre(',num2str(const_p),',',num2str(const_l),',',lag_input,')']);
但是,这会为最后一行返回以下错误;
使用 horzcat
时出错连接的矩阵的尺寸不一致。
我认为这是因为转换为字符串的三个对象具有不同的大小,但在使它们大小相同之后,问题仍然存在。
如果可以避免,我宁愿避免遍历每个元素。
答案 0 :(得分:2)
我会稍微改变一下。下面怎么样?请注意,我从您的选择中更改了const_p和const_l,因为生成的Laguerre多项式在其他方面非常钝。
const_p = 2;
const_l = 1;
%generate the symbolic polynomial in x
lagpoly=feval(symengine,'orthpoly::laguerre',const_p,const_l,'x');
%Find the polynomical coefficients so we can evaluate using MATLAB's poly
coeff=double(feval(symengine,'coeff',lagpoly));
%generate a matrix the same size as coord_r in the original question
x=rand(512);
%Do the evaluation
u_pl=polyval(coeff,x);
答案 1 :(得分:2)
for
循环:MuPAD的map
函数。这就是几乎所有MuPAD函数必须被矢量化的方式,因为它们通常是为标量符号变量而不是数值数组而设计的。这是一个基本的例子:
const_p = 2;
const_l = 1;
mesh_size = 0.2;
x_min = 0;
x_max = 1;
y_min = 0;
y_max = 1;
[X,Y] = meshgrid(x_min:mesh_size:x_max,y_min:mesh_size:y_max);
coord_r = sqrt(X.^2 + Y.^2);
lagpoly = evalin(symengine,['map(' char(sym(coord_r)) ...
',x->orthpoly::laguerre(' char(sym(const_p)) ...
',' char(sym(const_l)) ',x))'])
返回
lagpoly =
[ 3, 121/50, 47/25, 69/50, 23/25, 1/2]
[ 121/50, 76/25 - (3*2^(1/2))/5, 31/10 - (3*5^(1/2))/5, 16/5 - (3*2^(1/2)*5^(1/2))/5, 167/50 - (3*17^(1/2))/5, 88/25 - (3*26^(1/2))/5]
[ 47/25, 31/10 - (3*5^(1/2))/5, 79/25 - (6*2^(1/2))/5, 163/50 - (3*13^(1/2))/5, 17/5 - (6*5^(1/2))/5, 179/50 - (3*29^(1/2))/5]
[ 69/50, 16/5 - (3*2^(1/2)*5^(1/2))/5, 163/50 - (3*13^(1/2))/5, 84/25 - (9*2^(1/2))/5, 1/2, 92/25 - (3*34^(1/2))/5]
[ 23/25, 167/50 - (3*17^(1/2))/5, 17/5 - (6*5^(1/2))/5, 1/2, 91/25 - (12*2^(1/2))/5, 191/50 - (3*41^(1/2))/5]
[ 1/2, 88/25 - (3*26^(1/2))/5, 179/50 - (3*29^(1/2))/5, 92/25 - (3*34^(1/2))/5, 191/50 - (3*41^(1/2))/5, 4 - 3*2^(1/2)]
调用double(lagpoly)
会将结果转换为浮点数,您将看到这与@@ WalkingRandomly提供的解决方案相同(给定相同的输入)。当然你可以使用符号多项式或其系数来手动找到相同的东西,尽管不幸的是polyval
没有为类sym
重载(有evalp
但它也不是矢量化,因此需要与map
)一起使用。