如何从 Matlab 的公式中分解出特定变量?
How can I factor specific variables out of a formula in Matlab?
假设我有一个像这样的公式的列向量
N =
4*k2 + 5*k3 + k1*x
7*k2 + 8*k3 + k1*y
和像这样的符号变量的列向量
k =
k1
k2
k3
公式关于 k
是线性的。我想找到一个矩阵 M
使得 M*k
等于 N
.
我可以用 N/k
做到这一点。然而,这给出了
[ (4*k2 + 5*k3 + k1*x)/k1, 0, 0]
[ (7*k2 + 8*k3 + k1*y)/k1, 0, 0]
这是正确的,但不是我想要的。我要的是矩阵
x 4 5
y 7 8
这在我看来是最简单的答案,因为它不涉及 k
.
中的变量
如何说服 Matlab 从公式或公式向量中分解出指定的变量?
您可以使用coeffs
,具体形式
C = coeffs(p,vars)
returns coefficients of the multivariate polynomial p
with respect to the variables vars
.
由于第一个输入需要是多项式,所以需要传递N
的每个分量:
coeffs(N(1), k)
coeffs(N(2), k)
或者使用循环并将所有结果存储在符号数组中:
result = sym('result', [numel(N) numel(k)]); % create symbolic array
for m = 1:numel(N)
result(m,:) = coeffs(N(m), k);
end
在您的示例中,这给出了
result =
[ 5, 4, x]
[ 8, 7, y]
根据@LuisMendo 的回答,我使用了coeffs
。但是 coeffs
有几个问题。第一个是它的结果不包括任何为 0 的系数。第二个是它似乎不能保证系数的排序方式与其第二个参数中的变量相同。我想出了以下函数来替换 coeffs。
幸运的是,coeffs returns 第二个结果列出了与第一个结果中每个项目关联的变量。 (如果公式不是线性的就更复杂了。)
function m = factorFormula(f, v )
% Pre: f is a 1x1 sym representing a
% linear function of the variables in v.
% Pre: v is a column vector of variables
% Post: m is a row vector such that m*v equals f
% and the formulas in m do not contain the
% variables in v
[cx,tx] = coeffs(f,v)
n = size(v,1)
m = sym(zeros(1,n))
for i = 1:n
j = find(tx==v(i))
if size(j,2) == 1
m(i) = cx(j)
end
end
end
这仅适用于一个公式,但可以使用@LuisMendo 的答案中的循环或@Sanchises 评论中的等效表达式将其扩展为向量。
cell2sym(arrayfun( @(f)factorFormula(f,k),N,'UniformOutput',false ) )
我希望有比这更好的答案。
假设我有一个像这样的公式的列向量
N =
4*k2 + 5*k3 + k1*x
7*k2 + 8*k3 + k1*y
和像这样的符号变量的列向量
k =
k1
k2
k3
公式关于 k
是线性的。我想找到一个矩阵 M
使得 M*k
等于 N
.
我可以用 N/k
做到这一点。然而,这给出了
[ (4*k2 + 5*k3 + k1*x)/k1, 0, 0]
[ (7*k2 + 8*k3 + k1*y)/k1, 0, 0]
这是正确的,但不是我想要的。我要的是矩阵
x 4 5
y 7 8
这在我看来是最简单的答案,因为它不涉及 k
.
如何说服 Matlab 从公式或公式向量中分解出指定的变量?
您可以使用coeffs
,具体形式
C = coeffs(p,vars)
returns coefficients of the multivariate polynomialp
with respect to the variablesvars
.
由于第一个输入需要是多项式,所以需要传递N
的每个分量:
coeffs(N(1), k)
coeffs(N(2), k)
或者使用循环并将所有结果存储在符号数组中:
result = sym('result', [numel(N) numel(k)]); % create symbolic array
for m = 1:numel(N)
result(m,:) = coeffs(N(m), k);
end
在您的示例中,这给出了
result =
[ 5, 4, x]
[ 8, 7, y]
根据@LuisMendo 的回答,我使用了coeffs
。但是 coeffs
有几个问题。第一个是它的结果不包括任何为 0 的系数。第二个是它似乎不能保证系数的排序方式与其第二个参数中的变量相同。我想出了以下函数来替换 coeffs。
幸运的是,coeffs returns 第二个结果列出了与第一个结果中每个项目关联的变量。 (如果公式不是线性的就更复杂了。)
function m = factorFormula(f, v )
% Pre: f is a 1x1 sym representing a
% linear function of the variables in v.
% Pre: v is a column vector of variables
% Post: m is a row vector such that m*v equals f
% and the formulas in m do not contain the
% variables in v
[cx,tx] = coeffs(f,v)
n = size(v,1)
m = sym(zeros(1,n))
for i = 1:n
j = find(tx==v(i))
if size(j,2) == 1
m(i) = cx(j)
end
end
end
这仅适用于一个公式,但可以使用@LuisMendo 的答案中的循环或@Sanchises 评论中的等效表达式将其扩展为向量。
cell2sym(arrayfun( @(f)factorFormula(f,k),N,'UniformOutput',false ) )
我希望有比这更好的答案。