如果要計算矩陣的完整SVD,你可以使用包bigstatsr塊來進行計算。 A FBM
表示Filebacked Big Matrix,並且是類似於文件包big.matrix
包的對象bigmemory的對象。
library(bigstatsr)
options(bigstatsr.block.sizeGB = 0.5)
# Initialize FBM with random numbers
a <- FBM(1e6, 1e3)
big_apply(a, a.FUN = function(X, ind) {
X[, ind] <- rnorm(nrow(X) * length(ind))
NULL
}, a.combine = 'c')
# Compute t(a) * a
K <- big_crossprodSelf(a, big_scale(center = FALSE, scale = FALSE))
# Get v and d where a = u * d * t(v) the SVD of a
eig <- eigen(K[])
v <- eig$vectors
d <- sqrt(eig$values)
# Get u if you need it. It will be of the same size of u
# so that I store it as a FBM.
u <- FBM(nrow(a), ncol(a))
big_apply(u, a.FUN = function(X, ind, a, v, d) {
X[ind, ] <- sweep(a[ind, ] %*% v, 2, d, "/")
NULL
}, a.combine = 'c', block.size = 50e3, ind = rows_along(u),
a = a, v = v, d = d)
# Verification
ind <- sample(nrow(a), 1000)
all.equal(a[ind, ], tcrossprod(sweep(u[ind, ], 2, d, "*"), v))
這需要大約10分鐘在我的電腦上。
做任何這些工作'?qr'或'?Matrix :: qr'或'?MASS :: Null' – user20650
是的。我這樣做,但這些函數不適用於bigmatrix(S4類),或者我不能將它們用於大矩陣。我只能將這些函數用於常規矩陣,而不能用於大矩陣。 – Mahin
好吧,我不確定你是否有一個大的矩陣或bigmatrix;)。目前,您的問題是[偏離主題](https://stackoverflow.com/help/on-topic),因爲它直接要求提供套餐推薦,並且在目前的狀態下可能會關閉。但它很有趣。你可以編輯你的問題,請進一步的細節。例如,您可以添加一個bigmatrix的小示例(包括使用的任何軟件包),說明標準工具不工作的方式,也可能要求替代方案。謝謝 –
user20650