Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 利用函数构造辛矩阵_Python_Matrix_Constructor_Sympy_Callable - Fatal编程技术网

Python 利用函数构造辛矩阵

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] 我如何使用

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,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
,例如,一个你实际想要完成的任务的例子?