如何在Matlab中提取矩阵中的变量系数

How to extract coefficients of variables in a matrix in Matlab

假设我有下面的矩阵:

syms x y z
M = [x+y-z;2*x+3*y+-5*z;-x-y6*z];

我想要一个由变量 x、y 和 z 的系数组成的矩阵:

CM = [1,1,-1;2,3,-5;-1,-1,6];

如果我将 CM 乘以 [x;y;z],我希望得到 M

编辑

我有一个ODE系统:

(d/dt)A = B

AB是方阵。我想解这些方程组。我不想使用 Matlab 的 ode 求解命令。 如果我把上面的方程组变成:

(d/dt)a = M*a

那么我可以很容易地通过矩阵M的特征向量和值来解决它。这里a是一个包含变量的列向量,M是从B中提取系数的矩阵。

由于您似乎在使用 Symbolic Math Toolbox,因此您应该 diff 符号化地保存每个变量的导数:

syms x y z;
M=[x+y-z;2*x+3*y-5*z;-x-y+6*z];
Mdiff=[];
for k=symvar(M)
   Mdiff=[Mdiff diff(M,k)];
end

然后你得到

Mdiff =

[  1,  1, -1]
[  2,  3, -5]
[ -1, -1,  6]

如果您想以非字典顺序的方式对列进行排序,则需要使用您自己的向量而不是 symvar

更新

由于您提到这种方法很慢,使用 coeffsM 视为其变量的多项式可能会更快:

 syms x y z;
 M=[x+y-z;2*x+3*y-5*z;-x-y+6*z];
 Mdiff2=[];
 varnames=symvar(M);

 for k=1:length(M)
    Mdiff2=[Mdiff2; coeffs(M(k),varnames(end:-1:1))];
 end

请注意,出于某种原因(我不明白)coeffs 的输出与其输入变量列表相比是颠倒的,这就是为什么我们用 [=19 的明确颠倒版本来调用它=].

输出:

>> Mdiff2

Mdiff2 =

[  1,  1, -1]
[  2,  3, -5]
[ -1, -1,  6]

一样,如果您的符号向量在其组件中具有不同数量的变量,则第二种解决方案将不起作用。由于速度仅在您必须多次执行此操作时才重要,并且 M 中的参数配置很多,我建议以参数方式构建 M(这样系数也是 syms) 是可能的,那么你只需要执行一次第一个版本。剩下的只是代入结果。