我发现了一个代码,它可以为LU分解旋转一个方阵,但有些代码我无法理解。在
def pivotize(m):
"""Creates the pivoting matrix for m."""
n = len(m)
ID = [[float(i == j) for i in xrange(n)] for j in xrange(n)]
for j in xrange(n):
row = max(xrange(j, n), key=lambda i: abs(m[i][j]))
if j != row:
ID[j], ID[row] = ID[row], ID[j]
return ID
首先,ID的行不就是单位矩阵吗?这样做有什么好处吗?在
第二,我真的不明白排成一排。我知道lambda用于在文本中定义一个函数,它只返回M_ij的值(I的值取决于for循环),但I是什么?在
xrange不是和range相似吗?但它在这里会返回什么呢?在
当与函数max结合时,会发生什么?我只是不知道max函数里面有什么东西在比较。在
抱歉,如果这个问题听起来很愚蠢。我对编程很陌生
是的。在
See this有关max/key/lambda交互的讨论。回答“什么是})。在
i
?”,它是lambda函数的参数,i
可以等效为x
对于foo
。(为清楚起见,分别生成abs(m[x][j])
和{是的。在python2中,}将使用不同的实现产生相同的结果。在
xrange
返回一个sequence对象,该对象只在需要时才延迟地计算下一个值。See this for more info。当整个循环时,range
和{第5行的
xrange(n)
将返回从0到(n-1)的整数值,而第6行的xrange(j, n)
将返回从j到(n-1)的整数值。在编辑
关于lambda的更多信息:
考虑一下如何取一个给定的数字序列,并将每个数字加倍。首先定义一个将一个数字
x
加倍并返回该值的函数。然后将该函数映射到序列的每个元素。在您也可以使用匿名(lambda)函数来执行相同的操作:
^{pr2}$请注意,除了
double
函数的定义不存在外,对map
的调用中对函数的引用被“inline”lambda函数代替。在编辑2
这一行
row = max(xrange(j, n), key=lambda i: abs(m[i][j]))
可以分解如下:xrange(j,n)
生成从j
(包含)到n
(排他)的整数序列。在i
。lambda函数“返回”第i
行和第j
列的绝对值。[1]max
函数会找到这些“lambda outputs”的最大值,并将row
设置为该值。在也可以将其作为列表理解的最大值:
或者正如Dan D.在他的评论中指出的,作为生成器表达式编写(不创建中介列表)如下:
注意事项:
[1]这里有一些假设,但是行列是表示矩阵的标准方式。在
xrange
是一个Python2构造,用于处理range
的内存效率。在range
实际创建一个列表之前,for
循环将遍历它。xrange
但是它是一个生成器,这意味着它在被请求时一次输出1个值,而不创建完整的列表。在ID
实际上是一个单位矩阵。你就在那儿。这是一个很好的技巧,布尔值可以转换成值为1.0
的浮点值。在然后代码段遍历所有剩余的行,并在原始矩阵}关键字表示所谓的“匿名函数”。在
row = max(xrange(j, n), key=lambda i: abs(m[i][j]))
中找到该行的最大值。注意这里还有第二个很好的诀窍,max
可以对任何iterable对象进行操作,包括生成器。^该行中的{更详细地说:匿名函数是不绑定到标识符的函数。代码段中的Lambda函数接受1个值
i
,并在矩阵位置m[i][j]
返回一个绝对值。作为函数输入发送的值由生成器xrange(j, n)
提供。在max
然后取lambda函数的返回值作为它实际比较的值。例如,在python3中,不可能比较两种不同的类型。一、 e.比较string>;int生成:TypeError: unorderable types: str() > int()
。但是,如果我们确定列表中包含不同格式的数字,您可以执行以下操作:这只是表明,实际比较的值是
key
函数的返回值,而实际生成的值是原始输入值。在一旦找到了行的最大值,它通过替换
ID[j], ID[row] = ID[row], ID[j]
,将单位矩阵中的所有其他行围绕它“旋转”,这样只有最大值保留在对角线上。在这有助于防止在LU分解的下一步中按太小的数字进行除法。在
你得到的不是原始矩阵,旋转的,而是一个
1.0
s和0.0
s的矩阵,它是你的变换矩阵,乘以原始矩阵就会得到旋转矩阵。在这似乎是一个编写得非常好的函数,它可以节省内存并有助于python的性能。希望我做得对。在
相关问题 更多 >
编程相关推荐