如何使用R和Rcpp删除NumericVector中的元素以进行递归

Aug*_*bas 5 c++ recursion r insertion-sort rcpp

我试图了解更多关于如何使用Rcpp包的信息.所以我开始使用Rcpp测试基本的排序算法.我在这里开始了Hadley Wickham教程.

我以这种方式递归地成功实现了插入排序:

library(Rcpp)

vetor<-sample(100)
vetor
cppFunction("
    NumericVector insertionsortRC(NumericVector vetor, int n) {
        double aux;
        int i;

        if(n>1) {
            insertionsortRC(vetor,n-1);
            aux=vetor[n-1];
            i=n-1;
            while(vetor[i-1]>aux && i>=0 ) {
                vetor[i]=vetor[i-1];
                i--;
                }
            vetor[i]=aux;
            }

        return vetor;
        }
    ")
Run Code Online (Sandbox Code Playgroud)

但函数要求2个参数,然后我尝试这样:

cppFunction("
    NumericVector insertionsortRC(NumericVector vetor) {
        int n = vetor.size();

        double aux;
        int i;

        if(n>1) {
            vetor.erase(n-1);
            insertionsortRC(vetor);
            aux=vetor[n-1];
            i=n-1;
            while(vetor[i-1]>aux && i>=0 ) {
                vetor[i]=vetor[i-1];
                i--;
                }
            vetor[i]=aux;
            }

        return vetor;
        }
    ")
Run Code Online (Sandbox Code Playgroud)

我认为擦除在这里不是一个好主意,似乎我从内存中擦除了元素,并且在递归调用之后无法恢复它.我还想到问题可能在于vetor.erase(n-1); line,试过vetor.erase(n); 它编译了,但根本没用.

使用vetor.erase(n); 我在R中遇到以下错误:

insertionsortRC(vetor) *`/ usr/lib/R/bin/exec/R'出错:malloc():内存损坏:0x098db548*

with vetor.erase(n-1); 它有一个奇怪的输出:

insertionsortRC(vetor)[1] 3.607393e-313 3.300000e + 01 3.100000e + 01 8.600000e + 01 2.500000e + 01 7.000000e + 01 [7] 4.000000e + 01 8.800000e + 01 8.100000e + 01 1.300000e + 01 8.500000e + 01 8.700000e + 01 [13] 3.900000e + 01 6.000000e + 01 6.400000e + 01 1.000000e + 01 8.200000e + 01 8.900000e + 01 [19] 1.400000e + 01 6.600000e + 01 3.600000e + 01 1.500000e + 01 9.600000e + 01 2.600000e + 01 [25] 4.000000e + 00 5.400000e + 01 2.900000e + 01 8.300000e + 01 5.500000e + 01 6.800000e + 01 [31] 9.100000e + 01 6.000000e + 00 1.000000e + 02 5.100000e + 01 7.000000e + 00 5.300000e + 01 [37] 9.900000e + 01 6.500000e + 01 2.300000e + 01 9.400000e + 01 5.700000e + 01 9.000000e + 01 [43] 3.200000e + 01 4.700000e + 01 1.600000e + 01 5.000000e + 01 2.800000e + 01 3.000000e + 00 [49] 9.800000e + 01 1.100000e + 01 1.800000e + 01 7.600000e + 01 6.300000e + 01 7.700000e + 01 [55] 7.400000e + 01 4.900000e + 01 8.000000e + 00 9.700000e + 01 1.200000e + 01 2.700000e + 01 [61] 3.500000e + 01 7.900000e + 01 8.000000e + 01 2.000000 e + 01 6.700000e + 01 9.300000e + 01 [67] 5.000000e + 00 5.600000e + 01 9.000000e + 00 3.700000e + 01 2.400000e + 01 9.200000e + 01 [73] 6.900000e + 01 3.800000e + 01 4.400000 e + 01 1.700000e + 01 4.600000e + 01 4.300000e + 01 [79] 3.400000e + 01 1.900000e + 01 2.000000e + 00 9.500000e + 01 7.200000e + 01 1.000000e + 00 [85] 6.100000e + 01 4.100000 e + 01 6.200000e + 01 2.200000e + 01 4.200000e + 01 2.100000e + 01 [91] 8.400000e + 01 4.800000e + 01 7.800000e + 01 7.300000e + 01 3.000000e + 01 5.900000e + 01 [97] 5.800000 e + 01 5.200000e + 01 7.500000e + 01700000e + 01 [61] 3.500000e + 01 7.900000e + 01 8.000000e + 01 2.000000e + 01 6.700000e + 01 9.300000e + 01 [67] 5.000000e + 00 5.600000e + 01 9.000000e + 00 3.700000e + 01 2.400000 e + 01 9.200000e + 01 [73] 6.900000e + 01 3.800000e + 01 4.400000e + 01 1.700000e + 01 4.600000e + 01 4.300000e + 01 [79] 3.400000e + 01 1.900000e + 01 2.000000e + 00 9.500000 e + 01 7.200000e + 01 1.000000e + 00 [85] 6.100000e + 01 4.100000e + 01 6.200000e + 01 2.200000e + 01 4.200000e + 01 2.100000e + 01 [91] 8.400000e + 01 4.800000e + 01 7.800000 e + 01 7.300000e + 01 3.000000e + 01 5.900000e + 01 [97] 5.800000e + 01 5.200000e + 01 7.500000e + 01700000e + 01 [61] 3.500000e + 01 7.900000e + 01 8.000000e + 01 2.000000e + 01 6.700000e + 01 9.300000e + 01 [67] 5.000000e + 00 5.600000e + 01 9.000000e + 00 3.700000e + 01 2.400000 e + 01 9.200000e + 01 [73] 6.900000e + 01 3.800000e + 01 4.400000e + 01 1.700000e + 01 4.600000e + 01 4.300000e + 01 [79] 3.400000e + 01 1.900000e + 01 2.000000e + 00 9.500000 e + 01 7.200000e + 01 1.000000e + 00 [85] 6.100000e + 01 4.100000e + 01 6.200000e + 01 2.200000e + 01 4.200000e + 01 2.100000e + 01 [91] 8.400000e + 01 4.800000e + 01 7.800000 e + 01 7.300000e + 01 3.000000e + 01 5.900000e + 01 [97] 5.800000e + 01 5.200000e + 01 7.500000e + 01400000e + 01 1.700000e + 01 4.600000e + 01 4.300000e + 01 [79] 3.400000e + 01 1.900000e + 01 2.000000e + 00 9.500000e + 01 7.200000e + 01 1.000000e + 00 [85] 6.100000e + 01 4.100000 e + 01 6.200000e + 01 2.200000e + 01 4.200000e + 01 2.100000e + 01 [91] 8.400000e + 01 4.800000e + 01 7.800000e + 01 7.300000e + 01 3.000000e + 01 5.900000e + 01 [97] 5.800000 e + 01 5.200000e + 01 7.500000e + 01400000e + 01 1.700000e + 01 4.600000e + 01 4.300000e + 01 [79] 3.400000e + 01 1.900000e + 01 2.000000e + 00 9.500000e + 01 7.200000e + 01 1.000000e + 00 [85] 6.100000e + 01 4.100000 e + 01 6.200000e + 01 2.200000e + 01 4.200000e + 01 2.100000e + 01 [91] 8.400000e + 01 4.800000e + 01 7.800000e + 01 7.300000e + 01 3.000000e + 01 5.900000e + 01 [97] 5.800000 e + 01 5.200000e + 01 7.500000e + 01

有人可以告诉我是否:01.是否可以使用Rcpp和R实现此代码,只使用一个参数调用函数,即数据向量?02.如何正确地做到这一点?

Dir*_*tel 5

简述:

  1. 好消息是你的编译工作正常.

  2. 不太好的消息是段错误.可能是代码中的逻辑错误.

  3. 通常,添加或删除NumericVector等是一个坏主意.这些是浅类型,它们直接连接到同一对象的R存储器("无副本").这意味着延长或移除成本很高.考虑使用STL std::vector<double>.所有这些都记录在案.