Я сейчас пытаюсь реализовать SVD очень большой матрицы, используя bigmemory и irlba. Насколько я понимаю, мне нужно настроить команду mult в пакете irlba, что я и сделал следующим образом:
mult <- function(A, B, transpose=FALSE) {
if(is.null(dim(B))) B <- cbind(B)
if(transpose)
return(cbind((t(B) %*% A)[]))
cbind((A %*% B)[])
}
Однако, это не работает для запуска SVD на большой матрице с использованием irlba:
irlbaObject <- irlba(big, nv = 10, mult = mult)
Для воспроизводимости вот пример большой матрицы, на которой я хочу сделать SVD:
big <- file("big.txt", open = "a")
replicate(20, {
x <- matrix(rnorm(100 * 100), nrow = 10)
write.table(x, file = 'big.txt', append = TRUE,
row.names = FALSE, col.names = FALSE)
})
big <- read.big.matrix("big.txt", separated = FALSE,
type = "double",
backingfile = "big.bk",
backingpath = "/tmp",
descriptorfile = "big.desc")
Это сообщение об ошибке, которое я получаю:
Error in A %*% B : requires numeric/complex matrix/vector arguments
Called from: cbind((A %*% B)[])
У кого-нибудь есть идеи, как избежать этой ошибки?