如何在MATLAB中动态生成符号矩阵?

如何在MATLAB中动态生成符号矩阵?,matlab,matrix,symbolic-math,Matlab,Matrix,Symbolic Math,我需要在MATLAB中创建一个符号矩阵。它可以静态完成,如下所示 syms a11 a12 a21 a22; A = [a11 a12; a21 a22]; 或者使用紧凑语法作为 A = sym('A%d', [2 2]); 然而,我不知道这些语法中的任何一种应该如何允许动态初始化。我想使用两个循环分别初始化每个矩阵元素。一个可能的语法(它不是有效的MATLAB语法)可能是 其中,我使用(无效)语法p(l,m)(x1)指定p中的每个元素都是x1的函数。因此,P(2)将是元素P(l,m)=a*

我需要在MATLAB中创建一个符号矩阵。它可以静态完成,如下所示

syms a11 a12 a21 a22;
A = [a11 a12; a21 a22];
或者使用紧凑语法作为

A = sym('A%d', [2 2]);
然而,我不知道这些语法中的任何一种应该如何允许动态初始化。我想使用两个循环分别初始化每个矩阵元素。一个可能的语法(它不是有效的MATLAB语法)可能是

其中,我使用(无效)语法p(l,m)(x1)指定p中的每个元素都是x1的函数。因此,P(2)将是元素P(l,m)=a*sin(kl*2)*sin(km*2)的(n,n)矩阵。我知道可以通过在运行时构建矩阵字符串(A=[…])并使用eval进行计算来构造P。差不多

syms a x1;
command = [];
for i = 1:n
    for j = 1:n
        kl = i; km = j;
        command = [command ' + a*sin(' num2str(kl) '*x1)*sin(' num2str(km) '*x1)'];
        if(j < n) command = [command ',']; end
    end
    if(i < n) command = [command ';']; end
end
eval(['P(x1) = [' command '];'])
symsax1;
命令=[];
对于i=1:n
对于j=1:n
kl=i;km=j;
command=[command'+a*sin('num2str(kl)'x1)*sin('num2str(km)'x1');
如果(j
但是,使用eval是一种不好的做法,因此我认为此解决方案只是最后的手段。有什么正确的方法来实现我的目标吗


注意:为了简化代码,我编写了元素p(l,m)=a*sin(kl*x1)*sin(km*x1)。实际表达式是P(l,m)=sin(kl*x1)*sin(km*x1)*epsilon+kl*km*cos(kl*x1)*cos(km*x1)。*b+km*cos(km*x1)*sin(kl*x1)-kl*cos(kl*x1)*sin(km*x1)/(kl 2-km^2)。

如果您只是试图避免

循环的
,您可以使用,这会将它们隐藏起来:

syms a x1
n = 3;
x = meshgrid(1:n)*x1; % multiplying by the symbolic x1 makes x symbolic
P = a*sin(x).*sin(x.');
返回

P =

[         a*sin(x1)^2,   a*sin(2*x1)*sin(x1),   a*sin(3*x1)*sin(x1)]
[ a*sin(2*x1)*sin(x1),         a*sin(2*x1)^2, a*sin(2*x1)*sin(3*x1)]
[ a*sin(3*x1)*sin(x1), a*sin(2*x1)*sin(3*x1),         a*sin(3*x1)^2]

你到底想干什么?按照您的指示初始化矩阵,然后循环怎么样?--考虑添加一个你所期望的输入和输出的小例子。问题是,我不能同时指定索引(L,M)和依赖(X1);P(l,m)(x1)=。。。是无效语法。如果我只写P(l,m)=…,P将不是x1的函数。如果我写P(x1)=…,P将不是一个矩阵,而是一个1 x 1的符号表达式。如果你知道一种获得你想要的结果的方法(例如通过eval,或手动),请这样做,并将结果编辑到你的帖子中,说明你是如何得到它的。纯粹的描述很难继续下去。
P =

[         a*sin(x1)^2,   a*sin(2*x1)*sin(x1),   a*sin(3*x1)*sin(x1)]
[ a*sin(2*x1)*sin(x1),         a*sin(2*x1)^2, a*sin(2*x1)*sin(3*x1)]
[ a*sin(3*x1)*sin(x1), a*sin(2*x1)*sin(3*x1),         a*sin(3*x1)^2]