我正在使用Matrix软件包来创建大量零(〜14000x14000)稀疏矩阵。有谁知道计算这个矩阵的功率的最好方法吗?R稀疏矩阵电源
我试过A_pow2 = A%^%2但我得到错误:A%^%2中的错误:不是矩阵。下面是返回相同的错误一个简单的例子:
A = matrix(3,2,2)
A = Matrix(A,sparse=TRUE)
Apow2 = A%^%2
我正在使用Matrix软件包来创建大量零(〜14000x14000)稀疏矩阵。有谁知道计算这个矩阵的功率的最好方法吗?R稀疏矩阵电源
我试过A_pow2 = A%^%2但我得到错误:A%^%2中的错误:不是矩阵。下面是返回相同的错误一个简单的例子:
A = matrix(3,2,2)
A = Matrix(A,sparse=TRUE)
Apow2 = A%^%2
(编辑感谢@罗兰的评论)
自定义功能或许能够解决您的问题。每?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
'\'%^^%\'= function(x,k)Reduce(\'%*%\',rep(list(x),k))' – Roland
记忆的原因,它可能更可取的是使用(for 1(i - 1:(k - 1))x < - x%*%x'(这可能会通过JIT编译进行优化)。 – Roland
谢谢,我最终做了一些类似的事情,但只是使用了%*%的forloop,就像你做的那样,但当我扩大到需要使用的14000x14000矩阵时,需要很长时间。太糟糕了。最终,我正在寻找一种计算逆的有效方法。 Ax = y - >我使用solve(A,y),但对于所讨论的矩阵大约需要一分钟。无论如何,好的答案感谢罗兰和亚当! – Geoff
是来自'Matrix' pkg的'%^%'运算符吗?你有没有尝试简单地使用'^'代替'%^%'? –
@AdamSpannbauer这将是一个不同的操作,元素明智的权力。 – Roland
@罗兰谢谢你的澄清。我不熟悉'%^%'运算符。只是位于'expm' pkg –