2

在我的项目中,我必须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

另外,如果我对元组进行一些操作(例如颠倒顺序然后检查),则在由不同对象形成的情况下(例如 when =k1和= )它会失败k2Mulk1.args2*x,yk2.args2*y,x

我不能在这里使用排序,因为在这种情况下Add([x+y,z],evaluate=False)Add([x+z,y],evaluate=False)它将是两个不同的表达式。此外,如果我使用evalaute=True, 在这种情况下Add([x+y],x])Add([2*x+y])是相同的,这是我不想要的。

4

3 回答 3

1

Mul 不知道 x 和 y 都代表标量。矩阵乘法取决于参数的顺序,因此在您的示例中 k1 和 k2 不一定相等。如果您知道在您的程序中 x 和 y 将始终是标量(或乘法是可交换和关联的其他类型的值),则可能有一种方法可以从每个项中提取常量,比较常量并比较排序列表的条款。

于 2011-11-10T18:20:58.963 回答
0

以下内容对您有帮助吗?

print simplify(k1 - k2) == 0 # True
print k1 == k2 # Still False
于 2011-11-11T15:45:31.937 回答
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()然后比较两个列表

于 2011-11-12T11:42:20.600 回答