【发布时间】:2013-03-20 09:20:04
【问题描述】:
我准备了一个随机数矩阵,计算它的逆矩阵并将其与原始矩阵相乘。这在理论上给出了单位矩阵。我怎样才能让numpy 为我这样做?
import numpy
A = numpy.zeros((100,100))
E = numpy.zeros((100,100))
size = 100
for i in range(size):
for j in range(size):
A[i][j]+=numpy.random.randint(10)
if i == j:
E[i][j]+=1
A_inv = numpy.linalg.linalg.inv(A)
print numpy.dot(A, A_inv)
运行代码产生
[me]machine @ numeric $ python rand_diag.py
[[ 1.00000000e+00 -7.99360578e-15 -1.14491749e-16 ..., 3.81639165e-17
-4.42701431e-15 1.17961196e-15]
[ -5.55111512e-16 1.00000000e+00 -2.22044605e-16 ..., -3.88578059e-16
1.33226763e-15 -8.32667268e-16]
很明显,结果是一个单位矩阵,但并不精确,所以print numpy.dot(A, A_inv) == E 显然给出了False。我这样做是为了练习线性代数并试图找到我的机器达到其极限的矩阵大小。获得True 将具有教学吸引力。
编辑:
设置size=10000,我内存不足
[me]machine @ numeric $ Python(794) malloc:
***mmap(size=800002048) failed (error code=12)
*** error: can\'t allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "rand_diag.py", line 14, in <module> A_inv = numpy.linalg.linalg.inv(A)
File "/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 445, in inv
return wrap(solve(a, identity(a.shape[0], dtype=a.dtype)))
File "/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 323, in solve
a, b = _fastCopyAndTranspose(t, a, b)
File "/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/numpy/linalg/linalg.py", line 143, in _fastCopyAndTranspose
cast_arrays = cast_arrays + (_fastCT(a),)
MemoryError
[1]+ Exit 1 python rand_diag.py
如何分配更多内存以及如何并行运行(我有 4 个内核)?
【问题讨论】:
-
这不是others 推荐的。
-
完全不清楚将矩阵乘以它的逆矩阵如何帮助“找到我的机器达到其极限的矩阵大小”。你真正想做什么?您是指内存限制、浮点舍入错误变得无法容忍的限制、执行时间限制还是其他什么?如果你想要一个单位矩阵,请使用
numpy.identity(n)。 -
获取
True在教学上非常没有吸引力,因为它会导致学生将有限精度浮点运算与无限精度实数运算混淆。学习计算机逼近线性代数的学生需要学会不断意识到这种差异,并预测其后果。 -
我承认你的观点都非常有效。 @EricPostpischil:目前,我在运行
size=10000矩阵的反转时观察到 100% 的 CPU 负载。内存仍然相当可用,如果我知道如何使用,我会将我机器的所有四个 CPU 分配给脚本,并为其提供所需的所有内存。有很多我想在这里更清楚地弄清楚...... -
@PatriciaShanahan:我目前最感兴趣,我们称之为规范线性代数,所以我只需要一些说明性的计算来了解正在发生的事情。计算细节稍后会引起关注,但不能无人看管。
标签: python numpy floating-point linear-algebra