Chciałbym nauczyć się korzystać z Rcpp . Przejrzałem dokumenty na stronie CRAN pakietu, ale wydaje mi się, że praca nad praktycznym przykładem (drugi praktyczny, biorąc pod uwagę convolve3) byłaby bardziej pomocna.
Proponuję następujący kod z pakietu robustbase , ponieważ nie jest ani za długi, ani za krótki, wykorzystuje kombinację typów R i funkcji R oraz ma jedną z tych małych iteracji arytmetycznych, które są zbyt wolne w R. Jak byś poszedł o Rcpp -Czy to?
scaleTau2<-function (x, c1 = 4.5, c2 = 3, consistency = TRUE, mu.too = FALSE){
n <- length(x)
medx <- median(x)
x. <- abs(x - medx)
sigma0 <- median(x.)
mu <- if (c1 > 0) {
x. <- x./(sigma0 * c1)
w <- 1 - x. * x.
w <- ((abs(w) + w)/2)^2
sum(x * w)/sum(w)
}
else medx
x <- (x - mu)/sigma0
rho <- x^2
rho[rho > c2^2] <- c2^2
if (!identical(consistency, FALSE)) {
Erho <- function(b) 2*((1-b^2)*pnorm(b)-b*dnorm(b)+b^2)-1
Es2 <- function(c2) Erho(c2*qnorm(3/4))
nEs2 <-ifelse(consistency == "finiteSample",n-2,n)*Es2(c2)
}
else nEs2 <- n
c(if (mu.too) mu, sigma0 * sqrt(sum(rho)/nEs2))
}
Wyjaśnij jak najwięcej.
EDYCJA Naprawdę chodzi o krok po kroku wyjaśnienie, w jaki sposób zająłbyś się konwertowaniem dobrze napisanego (i udokumentowanego) kodu R (co najmniej podstawy są w porządku) na wydajną implementację. Wybór kodu jest nieco przypadkowy, ale myślę, że odzwierciedla on typowy dla naszych skryptów skrypt (wywołuje funkcje R, których nie chce się tłumaczyć, używa pętli arytmetycznych ....).
EDIT2 z komentarzy zdaję sobie sprawę, że może to być naprawdę duża praca w C ++ (nie zdawałem sobie z tego sprawy podczas publikowania kodu). W związku z tym stosowanie poszczególnych utworów jako narzędzi pedagogicznych jest w porządku. W końcu przeanalizuję wszystkie elementy, edytując pytanie.
Odpowiedzi:
Interesujące pytanie, ale być może zbyt trudne, aby je krótko omówić:
Potrzebne byłyby implementacje po stronie C ++
median()
Cytowany kod z pakietu robustbase jest wysoce „zoptymalizowany pod kątem R”, co może nie być najlepszym punktem wyjścia.
Rcpp nie jest „kompilatorem R”, w którym rzucasz dowolną taką funkcję, aby „przyspieszyć”. Chodzi raczej o podłączenie istniejącego kodu C ++ lub pisanie nowego kodu C ++.
Oczywiście powyższe można przetłumaczyć (równoważność Turinga i tak dalej), ale nie może to być najlepszy sposób na naukę korzystania z Rcpp . Myślę, że mamy prostsze przykłady na liście mailingowej.
Wreszcie, czy nie jest to pytanie programistyczne dla SO? ;-)
źródło