R 如何计算大型对角矩阵逆(dim 14000*14000)

R 如何计算大型对角矩阵逆(dim 14000*14000),r,matrix,matrix-inverse,R,Matrix,Matrix Inverse,如何计算巨大(dim 14000*14000)矩阵的逆? 我正在尝试使用R,错误消息如下所示: Error: cannot allocate vector of size 762.9 Mb 我知道这表示无法获取内存。 任何帮助都将不胜感激 即使当我尝试反转一个标量单位矩阵时,R也无法求解它。标量单位矩阵的逆矩阵是同一个矩阵,但R也不能求解 > solve(diag(1,10000,10000)) Error: cannot allocate vector of size 762.9 Mb

如何计算巨大(dim 14000*14000)矩阵的逆? 我正在尝试使用R,错误消息如下所示:

Error: cannot allocate vector of size 762.9 Mb
我知道这表示无法获取内存。 任何帮助都将不胜感激

即使当我尝试反转一个标量单位矩阵时,R也无法求解它。标量单位矩阵的逆矩阵是同一个矩阵,但R也不能求解

> solve(diag(1,10000,10000))
Error: cannot allocate vector of size 762.9 Mb
对于大型,请使用:

库(矩阵)
##构造大型稀疏对角矩阵的高效内存表示
dmat对于较大的,使用:

库(矩阵)
##构造大型稀疏对角矩阵的高效内存表示

dmat首先,确保使用64位版本的R和具有planty RAM的机器

虽然矩阵求逆是一个计算复杂的操作,需要O(n^3)算术运算,但对于n=10000甚至n=16000,这远不是不可能的。在我不太现代化的PC上,使用“英特尔数学内核库”(Revolution R)运行R时,我观察到以下几点

对于n=10000,它在1.5分钟内运行,并使用3.2 GB的RAM:

system.time({
  z = solve(diag(1,10000,10000))
});

  user  system elapsed 
341.89    0.63   87.22 
对于n=16000,它在6分钟内完成,并使用8GB的RAM

system.time({
  z = solve(diag(1,16000,16000))
});

   user  system elapsed 
1388.80    2.34  353.95

首先,确保使用64位版本的R和具有planty RAM的机器

虽然矩阵求逆是一个计算复杂的操作,需要O(n^3)算术运算,但对于n=10000甚至n=16000,这远不是不可能的。在我不太现代化的PC上,使用“英特尔数学内核库”(Revolution R)运行R时,我观察到以下几点

对于n=10000,它在1.5分钟内运行,并使用3.2 GB的RAM:

system.time({
  z = solve(diag(1,10000,10000))
});

  user  system elapsed 
341.89    0.63   87.22 
对于n=16000,它在6分钟内完成,并使用8GB的RAM

system.time({
  z = solve(diag(1,16000,16000))
});

   user  system elapsed 
1388.80    2.34  353.95

这是基本代数:如果你的
X
矩阵确实是对角的,那么逆
Y
就是一个对角矩阵,它的对角元素是
Y{i,i}=1/X{i,i}

因此,只要做:

x = diag(rnorm(14E3))
inv = diag(1/diag(x))

这是基本代数:如果你的
X
矩阵确实是对角的,那么逆
Y
就是一个对角矩阵,它的对角元素是
Y{i,i}=1/X{i,i}

因此,只要做:

x = diag(rnorm(14E3))
inv = diag(1/diag(x))

还请注意,对于对角线
m
而言,它只是
1/m
。如果矩阵不是稀疏的,这将是不可能的(或者至少是非常非常非常困难的)。根据您试图做的事情,通常会有一些计算捷径来解决实际不需要反转矩阵的问题(例如,求解线性系统、计算特征值等)。还请注意,对于对角线
m
,它只是
1/m
。如果您的矩阵不是稀疏的,这将是不可能的(或至少非常、非常、非常困难)。根据您尝试做的事情,通常存在解决问题的计算捷径,这些捷径实际上不需要矩阵求逆(例如,求解线性系统、计算特征值等)