<p><code>xrange</code>是一个Python2构造,用于处理<code>range</code>的内存效率。在<code>range</code>实际创建一个列表之前,<code>for</code>循环将遍历它。<code>xrange</code>但是它是一个生成器,这意味着它在被请求时一次输出1个值,而不创建完整的列表。在</p>
<p><code>ID</code>实际上是一个单位矩阵。你就在那儿。这是一个很好的技巧,布尔值可以转换成值为<code>1.0</code>的浮点值。在</p>
<p>然后代码段遍历所有剩余的行,并在原始矩阵<code>row = max(xrange(j, n), key=lambda i: abs(m[i][j]))</code>中找到该行的最大值。注意这里还有第二个很好的诀窍,<code>max</code>可以对任何iterable对象进行操作,包括生成器。^该行中的{<cd10>}关键字表示所谓的“匿名函数”。在</p>
<p>更详细地说:匿名函数是不绑定到标识符的函数。代码段中的Lambda函数接受1个值<code>i</code>,并在矩阵位置<code>m[i][j]</code>返回一个绝对值。作为函数输入发送的值由生成器<code>xrange(j, n)</code>提供。在</p>
<p><code>max</code>然后取lambda函数的返回值作为它实际比较的值。例如,在python3中,不可能比较两种不同的类型。一、 e.比较string>;int生成:<code>TypeError: unorderable types: str() > int()</code>。但是,如果我们确定列表中包含不同格式的数字,您可以执行以下操作:</p>
<pre><code>>>> l = ["1", "2", 3, 4]
>>> max(l, key=lambda x: int(x))
4
>>> min(l, key=lambda x: int(x))
'1' #type 'str'
</code></pre>
<p>这只是表明,实际比较的值是<code>key</code>函数的返回值,而实际生成的值是原始输入值。在</p>
<p>一旦找到了行的最大值,它通过替换<code>ID[j], ID[row] = ID[row], ID[j]</code>,将单位矩阵</strong>中的所有其他行</strong>围绕它“旋转”,这样只有最大值保留在对角线上。在</p>
<p>这有助于防止在LU分解的下一步中按太小的数字进行除法。在</p>
<p>你得到的不是原始矩阵,旋转的,而是一个<code>1.0</code>s和<code>0.0</code>s的矩阵,它是你的变换矩阵,乘以原始矩阵就会得到旋转矩阵。在</p>
<p>这似乎是一个编写得非常好的函数,它可以节省内存并有助于python的性能。希望我做得对。在</p>