2017-07-28 155 views
0

我正在使用Matrix软件包来创建大量零(〜14000x14000)稀疏矩阵。有谁知道计算这个矩阵的功率的最好方法吗?R稀疏矩阵电源

我试过A_pow2 = A%^%2但我得到错误:A%^%2中的错误:不是矩阵。下面是返回相同的错误一个简单的例子:

A = matrix(3,2,2) 
A = Matrix(A,sparse=TRUE) 
Apow2 = A%^%2 
+0

是来自'Matrix' pkg的'%^%'运算符吗?你有没有尝试简单地使用'^'代替'%^%'? –

+1

@AdamSpannbauer这将是一个不同的操作,元素明智的权力。 – Roland

+0

@罗兰谢谢你的澄清。我不熟悉'%^%'运算符。只是位于'expm' pkg –

回答

1

(编辑感谢@罗兰的评论)

自定义功能或许能够解决您的问题。每?expm::`%^%`

Compute the k-th power of a matrix. Whereas x^k computes element wise powers, x %^% k corresponds to k - 1 matrix multiplications, x %*% x %*% ... %*% x.

文档,我们可以写一个新的管道符执行乘法K-1倍。不知道它将如何扩展,但它在更小的例子中起作用。

> library(Matrix) 
> library(expm) 
> A = matrix(3,2,2) 
> B = Matrix(A,sparse=TRUE) 
> 
> # changed lapply to rep list 
> `%^^%` = function(x, k) Reduce(`%*%`, rep(list(x), k)) 
> # per Roland for loop approach will be better on memory 
> `%^^%` = function(x, k) {for (i in 1:(k - 1)) x <- x %*% x; x} 
> 
> as.matrix(B%^^%2) 
    [,1] [,2] 
[1,] 18 18 
[2,] 18 18 
> A%^%2 
    [,1] [,2] 
[1,] 18 18 
[2,] 18 18 
+1

'\'%^^%\'= function(x,k)Reduce(\'%*%\',rep(list(x),k))' – Roland

+1

记忆的原因,它可能更可取的是使用(for 1(i - 1:(k - 1))x < - x%*%x'(这可能会通过JIT编译进行优化)。 – Roland

+0

谢谢,我最终做了一些类似的事情,但只是使用了%*%的forloop,就像你做的那样,但当我扩大到需要使用的14000x14000矩阵时,需要很长时间。太糟糕了。最终,我正在寻找一种计算逆的有效方法。 Ax = y - >我使用solve(A,y),但对于所讨论的矩阵大约需要一分钟。无论如何,好的答案感谢罗兰和亚当! – Geoff