代码之家  ›  专栏  ›  技术社区  ›  Freya W

用参数而不是值来解决矩阵和向量乘法(最好用python)

  •  1
  • Freya W  · 技术社区  · 1 年前

    我想看看一些向量运算,看看哪些矩阵元素进入哪个向量,例如,如果我定义了一个有元素的矩阵

    mat = [["a11", "a12"], ["a21", "a22"]]
    

    以及一个向量

    vec = ["v1", "v2"]
    

    然后我在寻找一些模块/库,当我计算产品时,它会给我结果:

    res = mat*vec = ["a11"*"v1" + "a12"*"v2", "a21"*"v1" + "a22"*"v2"]
    

    我知道如果所有参数都是numpy的实际数字,这很容易做到,当然我可以手工计算出来,但如果操作变得更加复杂,最好有一种方法可以自动生成结果向量作为参数方程。

    如果方程式被简化,例如结果在某个地方有+“a11”-“a11“,并将其减少到0,则加分。

    这在python中有可能实现吗?Wolfram Alfa给了我我想要的东西,但我还需要对输入数据进行一些操作,所以用脚本来实现这一点会很棒。

    1 回复  |  直到 1 年前
        1
  •  6
  •   Stef    1 年前

    您已将问题标记为“numpy”,但numpy是一个用于数值计算的库。

    对于符号计算,请使用库 sympy 相反。

    import sympy
    
    v1, v2, a11, a12, a21, a22 = sympy.symbols('v1 v2 a11 a12 a21 a22')
    
    m = sympy.Matrix([[a11, a12], [a21, a22]])
    v = sympy.Matrix([v1, v2])
    
    u = m @ v
    
    print(u)
    
    # Matrix([
    # [a11*v1 + a12*v2],
    # [a21*v1 + a22*v2]])
    

    标准python中几乎所有可用的运算符都可以在sympy中使用。要记住两件重要的事情:

    • 从不使用 math 使用sympy函数,而不是使用它们的 sympy 例如,等效 sympy.sqrt 而不是 math.sqrt 平方根;
    • 有时,在应用运算符之前,您需要先转换为sympy,例如 1 / 3 将被解释为标准的python划分,并四舍五入为 0.3333333333333333 但是 sympy.S(1) / 3 sympy.Rational(1, 3) 将代表三分之一的精确分数。