2017-07-28 156 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