我如何可以加快以下(小白)代碼:讓這個循環更快R中
#"mymatrix" is the matrix of word counts (docs X terms)
#"tfidfmatrix" is the transformed matrix
tfidfmatrix = Matrix(mymatrix, nrow=num_of_docs, ncol=num_of_words, sparse=T)
#Apply a transformation on each row of the matrix
for(i in 1:dim(mymatrix)[[1]]){
r = mymatrix[i,]
s = sapply(r, function(x) ifelse(x==0, 0, (1+log(x))*log((1+ndocs)/(1+x))))
tfmat[i,] = s/sqrt(sum(s^2))
}
return (tfidfmatrix)
問題是,我工作的矩陣是相當大的(〜40kX100k),而這種代碼是非常慢。
我不使用「apply」(而不是使用for循環和sapply)的原因是應用將給我矩陣的轉置我想 - 我想num_of_docs X num_of_words,但應用會給我轉置。那麼我將不得不花更多的時間來計算轉置並重新分配它。
任何想法讓這個更快?
非常感謝。
編輯:我發現下面的建議大大加快了我的代碼(除了讓我感到愚蠢)。我可以從哪裏學習編寫「優化」R代碼的任何建議?
編輯2:好的,所以有些事情是不對的。一旦我做了s.vec[!is.finite(s.vec)] <- 0
s.vec的每個元素都被設置爲0.只是重新迭代我的原始矩陣是一個包含整數的稀疏矩陣。這是由於我正在使用的Matrix
軟件包的一些怪癖。當我做s.vec[which(s.vec==-Inf)] <- 0
事情按預期工作。思考?
我不知道r,但你有沒有試過在循環之外移動dim(mymatrix)? (你能嗎?) – 2012-03-05 18:37:47
他們可能可以但它不會有很大的區別。 – Dason 2012-03-05 19:29:11
我相信我前段時間在R FAQ中找到了這個。 http://www.burns-stat.com/pages/Tutor/R_inferno.pdf。這是一個向量化的精彩而易讀的指南。 – digitalmaps 2012-03-06 03:16:37