如何在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
A
和B
是方阵。我想解这些方程组。我不想使用 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
。
更新
由于您提到这种方法很慢,使用 coeffs
将 M
视为其变量的多项式可能会更快:
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
(这样系数也是 sym
s) 是可能的,那么你只需要执行一次第一个版本。剩下的只是代入结果。
假设我有下面的矩阵:
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
A
和B
是方阵。我想解这些方程组。我不想使用 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
。
更新
由于您提到这种方法很慢,使用 coeffs
将 M
视为其变量的多项式可能会更快:
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
(这样系数也是 sym
s) 是可能的,那么你只需要执行一次第一个版本。剩下的只是代入结果。