使用函数

时间:2016-03-14 23:07:17

标签: python matrix constructor sympy callable

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构造的一部分用任何其他参数调用(除前两个强制性论点外)。我尝试使用以下代码调用示例函数:

>>> 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})

也不起作用。有可能这样做吗?

2 个答案:

答案 0 :(得分:1)

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

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)。但是上述任何一个都应该可行(编写一个生成矩阵的函数,或者编写一个生成函数的函数)。

答案 1 :(得分:0)

您可以使用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]])