Python 利用函数构造辛矩阵
Symphy文档提供了使用规则创建矩阵的示例:Python 利用函数构造辛矩阵,python,matrix,constructor,sympy,callable,Python,Matrix,Constructor,Sympy,Callable,Symphy文档提供了使用规则创建矩阵的示例: >>> 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):
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(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})
也不行。可以这样做吗?您可以使用
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]])
我假设你想要这个,这样你就可以根据参数的值生成一个不同的矩阵。在这种情况下,您应该创建一个单独的外部函数来返回矩阵,如
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
)
您还可以将其设置为将函数调用为矩阵(4,4,f(l))
换句话说,f(l)
生成一个函数,给出该l
的矩阵值
def f(l):
def _inner(i, j):
if i == j:
return l
else:
return 0
return _inner
无法修改
矩阵
构造函数本身,以便编写矩阵(4,4,f,l)
。但上述任何一项都应该是可行的(编写一个生成矩阵的函数,或编写一个生成函数的函数) 如果f
的结构与问题中的结构相同(即以l
作为参数),您知道我所问的方法吗?如果可以的话,我会接受的,因为我认为这是一个更“蟒蛇式”的答案。@Charlie,我真的不明白你在找什么。您如何看待传入的参数l
?问题是您已经有了一个包含三个参数的函数f
?如果是这种情况,您可以使用functools.partial
将其转换为两个参数的版本。可能是我想做的是不可能的,尽管我不确定。使用functools.partial
,您似乎找到了最佳选择。对于未来的读者,请您编辑您的答案以演示functools.partial
?但我还是不明白您在寻找什么。你能至少说明一下你希望它如何工作吗?好的,我再次编辑了这个问题。请参见编辑2。@Charlie:然后你能不能再添加一个更复杂的f
,例如,一个你实际想要完成的任务的例子?