我正在使用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 –