交易中的机器学习:理论、模型、实践和算法交易 - 页 2756

 
Aleksey Nikolayev #:

我有一个在另一个大字符串中搜索模式/序列的函数,如果找到,则 ITINA,否则为 False

说明



我在 Rk 中有一个函数,但它在进行大型计算时速度很慢,或者说甚至有几个函数是用不同的样式编写的....。

这就是输入数据的样子,顺便说一下,两个字符串的长度可以是任意的。

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"

这是第一个以标准风格编写的s1 函数,清晰但繁琐。

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)   )
}

或更优雅的s2

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

这两个函数做同样的事情。

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

我有一个问题/请求--你能用 rcpp 帮我写这个简单的函数吗?

 
Maxim Dmitrievsky #:
我以为程序库中会有一些现成的工具,让你不费吹灰之力就能输出一些东西

就像几十页前 Reshetov 所做的那样。

(这与程序库无关)

 
mytarmailS #:

我有一个在另一个大字符串中搜索模式/序列的函数,如果找到,则为 ITINA,否则为 False

图例



我在 Rk 中有一个函数,但它在进行大型计算时速度很慢,或者说甚至有几个函数是用不同的样式编写的....

这就是输入数据的样子,顺便说一下,两个字符串的长度都可以是任意的。

这是第一个用标准样式编写的s1 函数,清晰但繁琐。

或更优雅的s2 函数。

两者做同样的事情

我有一个问题/请求--你能用 rcpp 帮我写这个简单的函数吗?

我还没准备好,因为我没有空闲时间,也不太喜欢编码和调试。如果你能自己解决这个问题,会对你更有帮助。如果可以的话,我会回答一些具体的技术问题。

 
Aleksey Nikolayev #:

我还没准备好接手,因为我没有空闲时间,也不太喜欢编码和调试。你自己解决会更有用。如果可以的话,我会回答一些具体的技术问题。

谢谢你没有帮我)我自己想出来了,这很好 )

R 代码

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 代码

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)


我有个问题:如何让 pat dat 输入变量既能接受数字向量(像现在这样),也能接受字符串向量?




p.s. 结果这个函数只快了 6 倍 (( 我还以为至少会快 100 倍呢 ((((

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 #:

谢谢你不帮忙)我自己想出来了,这很好 )

R 代码

Rcpp 代码


有一个问题:如何使 pat dat 输入变量既能接受数字向量(像现在这样),也能接受字符串向量?




p.s. 结果这个函数只快了 6 倍 (( 我还以为至少会快 100 倍呢 ((((

你可以用 R(编译)编译代码。我的代码速度提高了近 3 倍。

用 foreach 代替 for,加载所有内核。

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

你可以编译 R 代码(编译)。我的代码速度几乎提高了 3 倍。

使用 foreach 代替 for,加载所有内核。

R 3.4 起, 所有 R 代码都默认包含cmpfun 编译

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 编译 默认包含在所有 R 代码中

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

这篇文章让我明白,现在它似乎总是在编译软件包,顺便说 一句,在更新软件包时可以看到,行字节编译并为软件包的懒加载做准备

但我认为用户代码并未编译。我们通过源代码加载函数,但我在源代码的描述中并没有看到要加载的函数是经过编译的。

 
文章 " MQL5中使用矩阵和向量 " 发布

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

这篇文章让我明白,现在它似乎总是在编译软件包,顺便 可以看到在更新软件包时,行字节编译并为软件包的懒加载做准备

但我认为用户代码是不会被编译的。我们通过源代码加载函数,但我在源代码描述中没有看到要加载的函数是经过编译的。

嗯,我会试试的

 
mytarmailS #:

有一个问题:如何使 pat dat 输入变量既能接受数字向量(像现在这样),也能接受字符串向量?

重载的第一个想法是编写另一个同名但参数不同的函数。我从未在 Rcpp 中这样做过,所以不知道是否可行。我可能需要在一个单独的文件中编写 C 代码,并使用 sourceCpp() 代替 cppFunction()。