Ticarette makine öğrenimi: teori, pratik, ticaret ve daha fazlası - sayfa 2756

 
Aleksey Nikolayev #:

Başka bir büyük dizede bir desen / dizi arayan bir işlevim var, bulunursa ITINA aksi takdirde False

İLLÜSTRASYON



Rk'da bir fonksiyonum var ama büyük hesaplamalar için yavaş.... daha doğrusu farklı stillerde yazılmış birkaç fonksiyon bile var.

Giriş verileri bu şekilde görünüyor, bu arada her iki dizge de rastgele uzunlukta olabilir.

dat <- sample(letters[1:20],size = 30,replace = T)
pat <- c('a',"c","g")

dat
 [1] "h" "c" "q" "a" "s" "a" "d" "b" "c" "n" "a" "t" "e" "q" "s" "k" "j" "t" "l" "j" "n" "t" "r" "m" "h"
[26] "b" "o" "e" "g" "h"
pat
[1] "a" "c" "g"

İşte standart stilde yazılmış ilk s1 fonksiyonu, açık ama hantal.

s1 <- function(pat , dat){  
  lv <- rep(F,length(pat))
  k <- 1     
  for(i in 1:length(dat)){        
    if(dat[i] == pat[k]) 
    {
      lv[k] <- TRUE
      k <- k+1 
    }       
    if(k==length(pat)+1) break
  }
  return(  all(lv)   )
}

ya da daha zarif s2.

s2 <- function(pat , dat) grepl(paste(pat, collapse=".*"), paste(dat, collapse=""))

ikisi de aynı şeyi yapıyor.

s1(pat = pat,dat = dat)
[1] TRUE
s2(pat = pat,dat = dat)
[1] TRUE

Bir sorum/talebim var - bu basit fonksiyonu benim için rcpp'de yazabilir misiniz?

 
Maxim Dmitrievsky #:
Kütüphanede bazı kullanıma hazır araçlar olduğunu sanıyordum, böylece fazla çaba harcamadan bir şeyler çıkarabilirdiniz

Reshetov'un birkaç düzine sayfa önce yaptığı gibi.

(ve bu kütüphane ile ilgili değil)

 
mytarmailS #:

Başka bir büyük dizede bir desen / dizi arayan bir işlevim var, bulunursa ITINA aksi takdirde False

İLLÜSTRASYON



Rk'da bir fonksiyonum var ama büyük hesaplamalar için yavaş, daha doğrusu farklı stillerde yazılmış birkaç fonksiyon bile var....

Giriş verileri bu şekilde görünür, bu arada her iki dizge de rastgele uzunlukta olabilir.

İşte standart stilde yazılmış ilk s1 fonksiyonu, açık ama hantal.

ya da s2 gibi daha zarif bir şey.

ikisi de aynı şeyi yapıyor

Bir sorum/talebim var - bu basit işlevi benim için rcpp'de yazabilir misiniz?

Bunu yapmaya hazır değilim, çünkü boş zamanım yok ve kodlamayı ve hata ayıklamayı çok sevmiyorum. Ve bunu kendiniz çözmeniz sizin için daha yararlı olacaktır. Yapabilirsem bazı özel teknik soruları yanıtlayacağım.

 
Aleksey Nikolayev #:

Boş zamanım olmadığı ve kodlama ve hata ayıklamayı çok sevmediğim için bunu üstlenmeye hazır değilim. Ve bunu kendiniz çözmeniz sizin için daha faydalı olacaktır. Yapabilirsem bazı özel teknik soruları yanıtlayacağım.

Bana yardım etmediğiniz için teşekkürler) Kendim çözdüm ve bu harika)

R kodu

yes_seq <- function(pat , dat){  
  lv <- rep(F,length(pat))
  k <- 1     
  for(i in 1:length(dat)){        
    if(dat[i] == pat[k]){
      lv[k] <- TRUE
      k <- k+1 
    }       
    if(k==length(pat)+1) break
  }
  return(  all(lv)   )
}

Rcpp kodu

src <-
  "bool yes_seq_cpp(NumericVector pat, NumericVector dat){

    LogicalVector lv (pat.length() ,false);
    int k=0;

    for(int i=0; i<dat.length(); ++i){
    
      if(dat[i]==pat[k]){
            lv[k] = true;
            k = k+1; 
          }
if(k==pat.length())  break;
}
    
return  is_true(all(lv == true));
}
"
Rcpp::cppFunction(src)


Bir sorum var: pat dat giriş değişkenlerinin hem sayısal vektörleri (şimdi olduğu gibi) hem de dize vektörlerini kabul etmesini nasıl sağlayabilirim?




p.s. Fonksiyonun sadece 6 kat daha hızlı olduğu ortaya çıktı (( En az 100 kat daha hızlı olacağını düşünmüştüm ((((

microbenchmark::microbenchmark( yes_seq(pat,dat), yes_seq_cpp(pat,dat))

Unit: microseconds
                  expr    min     lq     mean median      uq     max neval cld
     yes_seq(pat, dat) 42.193 43.333 44.78712 43.903 45.0435 106.052   100   b
 yes_seq_cpp(pat, dat)  5.701  5.987  6.61993  6.272  6.8425  22.807   100  a 
 
mytarmailS #:

yardım etmediğiniz için teşekkürler) kendim çözdüm ve bu harika)

R kodu

Rcpp kodu


Bir soru var: pat dat giriş değişkenlerinin hem sayısal vektörleri (şimdi olduğu gibi) hem de dize vektörlerini kabul etmesi nasıl sağlanır?




p.s. Fonksiyonun sadece 6 kat daha hızlı olduğu ortaya çıktı (( En az 100 kat daha hızlı olacağını düşünmüştüm ((((

Kodu R (compile) ile derleyebilirsiniz. Kodda neredeyse 3 kat hızlanma elde ettim.

for yerine foreach kullanın, tüm çekirdekleri yükleyin.

 
СанСаныч Фоменко #:

R kodunu derleyebilirsiniz (compile). Kodda neredeyse 3 kat hızlanma elde ettim.

Tüm çekirdekleri yüklemek için for yerine foreach kullanın.

R 3.4 cmpfun derlemesi varsayılan olarak tüm R kodlarına dahil edildiğinden beri

https://stackoverflow.com/questions/41502721/could-someone-explain-what-compiling-in-r-is-and-why-it-would-speed-up-this-c
 
mytarmailS #:

R 3.4 cmpfun derlemesi varsayılan olarak tüm R kodlarına dahil edildiğinden beri

https:// stackoverflow.com/questions/41502721/could-someone-explain-what-compiling-in-r-is-and-why-it-would-speed-up-this-c

Bu yazıdan anladığım kadarıyla şimdi her zaman paketleri derliyor gibi görünüyor, bu arada paketleri güncellerken, byte-compile satırında ve paketi tembel yükleme için hazırlarken görülebilir.

Ancak kullanıcı kodunun derlenmediğini düşünüyorum. Fonksiyonları kaynağa göre yüklüyoruz ve kaynak açıklamasında yüklenecek fonksiyonun derlendiğini görmedim

 
MQL5 'teMatrisler ve Vektörlerle Çalışmamakalesi yayınlandı:

 
СанСаныч Фоменко #:

Bu yazıdan anladığım kadarıyla şimdi her zaman paketleri derliyor gibi görünüyor, bu arada paketleri güncellerken, satır bayt derlerken ve paketi tembel yükleme için hazırlarken görülebilir.

Ancak kullanıcı kodunun derlenmediğine inanıyorum. Fonksiyonları kaynağa göre yüklüyoruz ve kaynak açıklamasında yüklenecek fonksiyonun derlendiğini görmedim

hmm, bir deneyeceğim

 
mytarmailS #:

Bir soru var: pat dat giriş değişkenlerinin hem sayısal vektörleri (şimdi olduğu gibi) hem de dize vektörlerini kabul etmesi nasıl sağlanır?

Aşırı yükleme için ilk fikir, aynı isimde ancak farklı argümanlara sahip başka bir fonksiyon yazmaktır. Bunu Rcpp'de hiç yapmadım, bu yüzden işe yarayıp yaramayacağını bilmiyorum. Muhtemelen C kodunu ayrı bir dosyada yapmam ve cppFunction() yerine sourceCpp() kullanmam gerekecek.