Как я могу ускорить следующий (noob) код:
#"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), заключается в том, что apply даст мне транспонирование матрицы, которую я хочу - я хочу num_of_docs X num_of_words, но apply даст мне транспонирование. Затем мне придется тратить больше времени на вычисление транспонирования и его перераспределение.
Есть мысли, как сделать это быстрее?
Большое спасибо.
Редактировать: Я обнаружил, что приведенные ниже предложения значительно ускоряют мой код (помимо того, что я чувствую себя глупо). Любые предложения о том, где я могу научиться писать "оптимизированный" код R?
Редактировать 2: ОК, значит, что-то не так. Как только я сделаю s.vec[!is.finite(s.vec)] <- 0
, каждый элемент s.vec будет установлен в 0. Просто для повторения моей исходной матрицы будет разреженная матрица, содержащая целые числа. Это связано с какой-то странностью используемого мной пакета Matrix
. Когда я делаю s.vec[which(s.vec==-Inf)] <- 0
, все работает как положено. Мысли?