我找到了一个为 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 行不就是单位矩阵吗?这样做有什么好处吗?
其次,我不能真正理解line for row。我知道 lambda 用于在文本中定义一个函数,一旦提供了 i 的值(j 的值取决于 for 循环),它只是返回 M_ij 的值,但 i 是什么?
而且 xrange 不是类似于 range 吗?但是它在这里返回什么?
当与函数 max 结合时,会发生什么?我只是不知道正在比较的 max 函数内部的东西是什么。
如果这个问题听起来很愚蠢,我很抱歉。我对编程很陌生
最佳答案
First, isn't the line for ID simply the identity matrix?
是的。
Second, I can't really understand the line for row....
See this有关 max/key/lambda 交互的讨论。要回答“i
是什么?”,它是 lambda 函数的参数,i
可以等效为 x
for foo
。 (为清楚起见,分别生成 abs(m[x][j])
和 abs(m[foo][j])
)。
And isn't xrange similar to range?
是的。在 Python 2 中,xrange
返回一个序列对象,它仅在需要时才延迟计算下一个值。 See this for more info .当完全循环时,range
和 xrange
将产生相同的结果,但实现不同。
But what does it return here?
第 5 行的 xrange(n)
将返回从 0 到 (n-1) 的整数值,而第 6 行的 xrange(j, n)
将返回整数值从 j 到 (n-1)。
编辑
关于 lambda 的更多信息:
考虑如何将给定的数字序列加倍。首先定义一个将数字 x
加倍并返回该值的函数。然后将该函数映射到序列的每个元素。
# Traditional
def double(x): return x*2
print map(double, [1,2,3,4]) # [2, 4, 6, 8]
您也可以使用匿名 (lambda) 函数来做同样的事情:
# Lambda
print map(lambda i: i*2, [1,2,3,4]) # [2, 4, 6, 8]
请注意,一切都是一样的,除了 double
函数的定义消失了,并且在调用 map
时对该函数的引用被替换为“内联"lambda 函数。
编辑 2
And when combined with the function max, what happens?
这一行 row = max(xrange(j, n), key=lambda i: abs(m[i][j]))
可以分解如下:
xrange(j,n)
生成从j
(含)到n
(不含)的整数序列。- 然后,这些整数中的每一个都作为参数“传递”给函数的关键参数。换句话说,它们都用作 lambda 函数中的
i
。 lambda 函数“返回”第i
行和第j
列的绝对值。[1] max
函数然后找到这些“lambda 输出”的最大值并将row
设置为等于它。
这也可以写成列表理解的最大值:
row = max( [abs(m[i][j]) for i in xrange(j,n)] )
或作为 Dan D.在他的评论中指出,写成一个生成器表达式(没有创建中间列表)简单:
row = max( abs(m[i][j]) for i in xrange(j,n) )
注意事项:
[1] 这里有一些假设,但行列是表示矩阵的标准方式。
关于python - 在python中结合max、xrange和lambda函数的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28867463/