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})
也不起作用。有可能这样做吗?
答案 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]])