MATLAB R2012b - 将数组和整数传递给evalin(symengine,表达式)

时间:2014-01-08 03:50:54

标签: arrays matlab symbolic-math

我正在尝试生成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

时出错      

连接的矩阵的尺寸不一致。

我认为这是因为转换为字符串的三个对象具有不同的大小,但在使它们大小相同之后,问题仍然存在。

如果可以避免,我宁愿避免遍历每个元素。

2 个答案:

答案 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)

如果你需要快速的数字结果,@ walkingRandomly有最好的方法,通常就是这种情况。但是,如果您需要精确的分析值,可以使用一个技巧来避免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)一起使用。