【问题标题】:Using a matrix multiplication operator in a sympy expression在 sympy 表达式中使用矩阵乘法运算符
【发布时间】:2021-11-17 05:30:39
【问题描述】:

我正在尝试使用带有多个参数的 Sympy 表达式来实现一个函数。例如,我使用了以下代码:

import sympy
a = sympy.symbols("a")
ad = sympy.symbols("ad")
x = sympy.symbols("x")
c = sympy.symbols("c")
f = (ad*a)*c + x
func = sympy.lambdify((a,ad,x,c),f)

我想评价的是:

func(M_A,M_B,0,1)

当我使用两个矩阵M_AM_B 时,该函数只执行元素乘法,但我需要它是对象aad 的矩阵乘法。我知道当我使用MatrixSymbol 而不是symbols 定义变量时可以这样做,但在我的情况下这是不可能的,因为我已经实现了一个使用对角矩阵的场景,其中元素或矩阵乘法不会有所作为。此外,也可以用普通符号做这样的事情

x_vars = [symbols("x"+i) for i in range(1,4)]
trans_mat = np.random.random([3,3])
y_vars = trans_mat.dot(x_vars)

当我使用 MatrixSymbol 时,这似乎不起作用。

所以,我在想是否可以只计算表达式并使用常规符号执行所有操作,最后用numpy.matmul 替换所有乘法运算符。请让我知道这是否可能,或者任何其他可以提供帮助的建议也是受欢迎的。

谢谢!

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    help(func)我们可以看到lambdify产生的代码:

    Help on function _lambdifygenerated:
    
    _lambdifygenerated(a, ad, x, c)
        Created with lambdify. Signature:
        
        func(a, ad, x, c)
        
        Expression:
        
        a*ad*c + x
        
        Source code:
        
        def _lambdifygenerated(a, ad, x, c):
            return a*ad*c + x
    

    这是对 python/numpy 的简单翻译。听起来你想要(a@ad)*c+x

    【讨论】:

    • 我也试过了,但是Symbol不支持@运算符
    • 我不建议在sympy 中这样做。 lambdify 是一个比较基础的词法翻译器。对odf numpy没有深入了解。
    • 你能告诉我你会怎么做吗?我花了很长时间试图弄清楚这一点,但我做不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多