【问题标题】:Creating sympy matrix using function使用函数创建 sympy 矩阵
【发布时间】:2016-03-14 23:07:17
【问题描述】:

sympy 文档中有这个使用规则创建矩阵的示例:

>>> def f(i,j):
        if i == j:
            return 1
        else:
            return 0
>>> Matrix(4, 4, f)
[1  0  0  0]
[          ]
[0  1  0  0]
[          ]
[0  0  1  0]
[          ]
[0  0  0  1]

我将如何使用带参数的规则?例如使用函数:

>>> def f(i,j,l=1):
        if i == j:
            return 1*l
        else:
            return 0

我不知道怎么调用这样的函数。

编辑:澄清一下,我不是在寻找解决这个特定示例的解决方案 - 我在寻找更通用的解决方案。请假设作为矩阵创建规则的函数——即示例中的f——是任意复杂的。也就是说,它不能简单/容易地用 lambda 函数复制。所以换句话说,参数(示例中的l)必须包含在对函数(f)的调用中。可以这样做吗?

编辑 2:基本上我希望能够将 f 指定为独立函数(我的意思不是 lambda 函数),然后将其作为 Matrix 构造的一部分并带有任何附加参数(除了前 2 个强制参数)。我尝试使用如下代码调用示例函数:

>>> Matrix(4,4,f,l=7)

期待它会回来:

[7  0  0  0]
[          ]
[0  7  0  0]
[          ]
[0  0  7  0]
[          ]
[0  0  0  7]

但这不起作用。

>>> Matrix(4,4,f,{l=7})

也不行。可以这样做吗?

【问题讨论】:

    标签: python matrix constructor sympy callable


    【解决方案1】:

    您可以像这样使用lambda 表达式:

    l = 5
    Matrix(4, 4, lambda i,j: l if i==j else 0)
    

    或直接

    Matrix(4, 4, lambda i,j: 5 if i==j else 0)
    

    然后会给你:

    Matrix([
    [5, 0, 0, 0],
    [0, 5, 0, 0],
    [0, 0, 5, 0],
    [0, 0, 0, 5]])
    

    你当然也可以使用更复杂的表达式,比如

    Matrix(4, 4, lambda i,j: i*j if i==j else i-j)
    

    这会给你

    Matrix([
    [0, -1, -2, -3],
    [1,  1, -1, -2],
    [2,  1,  4, -1],
    [3,  2,  1,  9]])
    

    【讨论】:

    • @Charlie:您能否再添加一个更复杂的f,即您实际尝试完成的示例?
    【解决方案2】:

    我假设您想要这个,以便您可以根据参数的值生成不同的矩阵。在这种情况下,您应该创建一个单独的外部函数来返回矩阵,例如

    def diagonal(l):
        def f(i, j):
            if i == j:
                return l
            else: 
                return 0
        return Matrix(4, 4, f)
    

    (顺便说一下,对于这个特定的示例,您可以只使用diag(*[l]*4)eye(4)*l)。

    您也可以将函数调用为Matrix(4, 4, f(l))

    def f(l):
        def _inner(i, j):
            if i == j:
                return l
            else:
                return 0
        return _inner
    

    换句话说,f(l) 生成一个函数,该函数给出了该l 的矩阵值。

    无法修改Matrix 构造函数本身,以便编写Matrix(4, 4, f, l)。但是以上任何一个都应该是可行的(写一个生成矩阵的函数,或者写一个生成函数的函数)。

    【讨论】:

    • 如果f 与问题中的结构相同(即以l 作为参数),您知道一种方法吗?如果可以,我会接受,因为我认为这将是一个更“pythonic”的答案。
    • @Charlie 我真的不明白你在找什么。您如何设想传入的参数l?问题是您已经有一个函数f,它是三个参数吗?如果是这种情况,您可以使用 functools.partial 将其转换为两个参数版本。
    • 可能是我想做的事情是不可能的,尽管我不确定。似乎您正在寻找functools.partial 的最佳替代方案的正确轨道。对于未来的读者,您能否编辑您的答案以展示functools.partial
    • 但是我还是真的不明白你在找什么。你能至少指定你希望它如何工作吗?
    • 好的,我再次编辑了问题。请参阅编辑 2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-27
    • 2020-02-14
    • 2017-06-07
    • 1970-01-01
    • 2015-12-11
    • 2019-09-15
    相关资源
    最近更新 更多