假设我有一个像这样的公式的列向量
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从公式或公式向量中排除指定变量?
答案 0 :(得分:7)
您可以使用coeffs
,特别是表单
C = coeffs(p,vars)
返回有关变量p
的多元多项式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]
答案 1 :(得分:1)
根据@LuisMendo的回答,我使用了image = models.ImageField(default=None, upload_to='profile_pics', null=True, blank=True)
。但是coeffs
有两个问题。第一个是它的结果不包含任何为0的系数。第二个是它似乎并不能保证系数的排序与其第二个参数中的变量相同。我想出了以下函数来替换coeffs。
幸运的是,coeffs返回了第二个结果,该结果列出了与第一个结果中的每个项目相关联的变量。 (如果公式不是线性的,则更为复杂。)
coeffs
这仅适用于一个公式,但可以使用@LuisMendo答案中的循环或@Sanchises注释中的该等效表达式将其扩展为向量。
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
我希望有一个更好的答案。