在我的项目中,我必须在创建任何evaluate=false
或Add
对象时使用Mul
。在这种情况下,当我对这些对象应用相等性检查时,我遇到了问题。问题是由于参数的排序。
请考虑以下示例:
k2=Mul(*[x,y,2],evaluate=False)
k1=Mul(*[x,2,y],evaluate=False)
print k1==k2
结果为false
,k2.args
为(x,y,2)
,k1.args
为(x,2,y)
。
因此,当比较检查元组相等时,它返回false
。
有什么方法可以得到想要的结果吗?
另外,如果我对元组进行一些操作(比如反转顺序然后检查),那么当k1
和k2
由不同的Mul
个对象组成时,它会失败(比如k1.args
= 2*x,y
和k2.args
= 2*y,x
)
我不能在这里使用排序,因为在这种情况下Add([x+y,z],evaluate=False)
和Add([x+z,y],evaluate=False)
将是两个不同的表达式。此外,如果我使用evalaute=True
,在这种情况下,Add([x+y],x])
和Add([2*x+y])
将是相同的,我不想要。
答案 0 :(得分:1)
Mul并不知道x和y都代表了标量。矩阵乘法取决于参数的顺序,因此在您的示例中,k1和k2不一定相等。 如果你知道在你的程序中x和y将始终是标量(或其他类型的值,其中乘法是可交换和关联的),可能有一种方法可以从每个项中分解出常量,比较常量并比较排序列表条款。
答案 1 :(得分:0)
以下内容对您有帮助吗?
print simplify(k1 - k2) == 0 # True
print k1 == k2 # Still False
答案 2 :(得分:0)
找到一个解决方法。
在表达形式的Add / Mul类中 使用下面的代码展平所有参数
flatten_args = []
for arg in args:
if (arg.__class__==cls):
flatten_args.extend(arg.args)
else:
flatten_args.append(arg)
obj = Expr.__new__(cls, *flatten_args)
在平等检查时,我正在进行一次额外检查
首先对args列表进行排序arg_list.sort()
,然后比较两个列表