【发布时间】:2021-04-29 02:29:38
【问题描述】:
我正在尝试获取矩阵A 的一个修饰词A_adj 的单个元素,这两者都需要是符号表达式,其中符号x_i 是二进制的,矩阵A 是对称的和稀疏。 Python 的sympy 非常适合小问题:
from sympy import zeros, symbols
size = 4
A = zeros(size,size)
x_i = [x for x in symbols(f'x0:{size}')]
for i in range(size-1):
A[i,i] += 0.5*x_i[i]
A[i+1,i+1] += 0.5*x_i[i]
A[i,i+1] = A[i+1,i] = -0.3*(i+1)*x_i[i]
A_adj_0 = A[1:,1:].det()
A_adj_0
这会计算辅因子矩阵的第一个元素A_adj_0(即对应的minor)并正确地给我0.125x_0x_1x_2 - 0.28x_2x_2^2 - 0.055x_1^2x_2 - 0.28x_1x_2^2,这是表达式我需要,但是有两个问题:
- 这对于较大的矩阵是完全不可行的(对于 ~100 的
sizes,我需要这个)。 -
x_i是二进制变量(即 0 或 1),sympy似乎无法简化二进制变量的表达式,即简化多项式 x_i^n = x_i。
第一个问题可以通过求解线性方程组Ay = b 来部分解决,其中b 设置为第一个基向量[1, 0, 0, 0],这样y 是@ 的倒数的第一列987654336@。 y 的第一个条目是A 的倒数的第一个元素:
b = zeros(size,1)
b[0] = 1
y = A.LUsolve(b)
s = {x_i[i]: 1 for i in range(size)}
print(y[0].subs(s) * A.subs(s).det())
print(A_adj_0.subs(s))
这里的问题是y的第一个元素的表达式非常复杂,即使在使用simplify()等之后也是如此。这将是一个非常简单的表达式,简化了上面第 2 点中提到的二进制表达式。这是一种更快的方法,但对于较大的矩阵仍然不可行。
这归结为我的实际问题:
是否有一种有效的方法来计算稀疏对称符号矩阵的对数的单个元素,其中符号是二进制值?
我也愿意使用其他软件。
附录 1:
似乎可以通过我不知道的简单自定义替换来简化sympy 中的二进制表达式:
A_subs = A_adj_0
for i in range(size):
A_subs = A_subs.subs(x_i[i]*x_i[i], x_i[i])
A_subs
【问题讨论】:
-
这些是很好的提示,谢谢!这肯定会是一个进一步出现的问题,但不幸的是,在我当前的问题中,系数是真实的。因此,如果我正确理解这一点,则无法在有限域上进行计算。
标签: matrix binary sympy sparse-matrix inverse