2012-03-10 6 views
2

У меня возникли проблемы эффективна загрузка данных в разреженный формат матрица в R.эффективной загрузки разреженной матрицы в R

Вот (неполный) пример моей текущей стратегии:

library(Matrix) 
a1=Matrix(0,5000,100000,sparse=T) 
for(i in 1:5000) 
    a1[i,idxOfCols]=x 

Где x обычно имеет длину 20. Это неэффективно и, в конечном счете, замедляет сканирование. Я знаю, что есть лучший способ, но не знал, как это сделать. Предложения?

+0

Это хороший вопрос. У меня схожие проблемы. – suncoolsu

ответ

3

Вы можете заполнить матрицу сразу:

library(Matrix) 
n <- 5000 
m <- 1e5 
k <- 20 
idxOfCols <- sample(1:m, k) 
x <- rnorm(k) 

a2 <- sparseMatrix(
    i=rep(1:n, each=k), 
    j=rep(idxOfCols, n), 
    x=rep(x, k), 
    dims=c(n,m) 
) 

# Compare 
a1 <- Matrix(0,5000,100000,sparse=T) 
for(i in 1:n) { 
    a1[i,idxOfCols] <- x 
} 
sum(a1 - a2) # 0 
1

Вам не нужно использовать для цикла. Ю. может просто использовать стандартную матричную индексацию с двухколоночной матрицей:

a1[ cbind(i,idxOfCols) ] <- x 
Смежные вопросы