
19 Out
2013
19 Out
'13
18:06
@Mauro Sznelwar Qual sistema operacional você esta usando? Parece que o erro tem haver de estar faltando alguma coisa, o compilador de c++? Eu uso o ubunto aqui, e ja veio junto o compilador, o compilador está instalado ae certinho? Na verdade eu não entendo muito bem de rcpp, estou apenas testando, mas talvez seja algo nesse sentido o erro ae. Aqui funciona normal o codigo. E o vetor.erase(n) não funcionou :( Quando eu tentei assim, deu uma msg de erro: library(Rcpp) vetor<-sample(100) > cppFunction(" + NumericVector insertionsortRC(NumericVector vetor) { + int n = vetor.size(); + double aux; + int i; + if(n>1) { + vetor.erase(n); + 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; + } + ") > insertionsortRC(vetor) *** Error in `/usr/lib/R/bin/exec/R': malloc(): memory corruption: 0x098db548 *** Ai eu pensei se tinha algo haver com o indice, ai tentei com n-1, assim no vetor.erase(n-1) > vetor [1] 33 31 86 25 70 40 88 81 13 85 87 39 60 64 10 82 89 14 66 36 15 96 26 [24] 4 54 29 83 55 68 91 6 100 51 7 53 99 65 23 94 57 90 32 47 16 50 28 [47] 3 98 11 18 76 63 77 74 49 8 97 12 27 35 79 80 20 67 93 5 56 9 37 [70] 24 92 69 38 44 17 46 43 34 19 2 95 72 1 61 41 62 22 42 21 84 48 78 [93] 73 30 59 58 52 75 71 45 > 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.000000e+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.400000e+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.100000e+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.800000e+01 5.200000e+01 7.500000e+01 > Ai não funcionou. Mandando o vetor e o n junto, tudo funcionava, então acho que estou realizando alguma operação errada na chamada recursiva ali. Olhando a descrição do comando aqui: http://www.cplusplus.com/reference/vector/vector/erase/ Ele diz que apaga da memoria o valor, então imagino que talvez esteja dando problema na volta da recursão. Acho que não é tão simples usar Rcpp quanto imaginava. Quando no primeiro caso la ele diz "memory corruption: 0x098db548", esse é o endereço de memoria que eu usei errado não é? Em 19 de outubro de 2013 01:35, Benilton Carvalho < beniltoncarvalho@gmail.com> escreveu: > vetor.erase(n)? > On Oct 17, 2013 4:39 PM, "Augusto Ribas" <ribas.aca@gmail.com> wrote: > >> Ola pessoal. >> >> Eu estou com uma dificuldade em como fazer uma chamada recursiva usando o >> Rcpp. >> >> Por curiosidade, eu estava fazendo alguns códigos aqui usando o Rcpp, só >> por experiencia. >> Ai eu estava implementando o código para o insertion sort ( >> http://pt.wikipedia.org/wiki/Insertion_sort) >> >> Minha duvida é a seguinte: >> >> #Suponha que eu tenho um vetor qualquer: >> >> vetor<-sample(100) >> vetor >> >> #Iterativamente, eu fiz um código para usar com o Rcpp assim: >> >> library(Rcpp) >> >> cppFunction(" >> NumericVector insertionsortC(NumericVector vetor) { >> int n = vetor.size(); >> >> double aux; >> int i , j; >> >> for(i=1;i<n;i++) { >> aux=vetor[i]; >> j=i-1; >> while(j>=0 && vetor[j]>aux) { >> vetor[j+1]=vetor[j]; >> j=j-1; >> } >> vetor[j+1]=aux; >> } >> return vetor; >> } >> ") >> >> >> #Funcionou beleza. Ai eu fui tentar repetir a tentativa, recursivamente >> >> 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; >> } >> ") >> >> #E assim funcionou blz, mas eu tive que começar a mandar o argumento n, >> #que é o tamanho do vetor >> >> #o que eu queria é fazer algo aqui, na chamada recursiva >> >> #insertionsortRC(vetor,n-1); >> >> #sei la, se eu conseguir tirar o ultimo elemento, eu posso suprimir esse >> n-1 >> #Eu não entendo de Rcpp e C++ muito bem. >> #Mas tem uma forma simples de mudar o tamanho do vetor, ou arrancar o >> ultimo elemento dele >> #algo tipo vetor.pop() >> >> #pra fazer a chamada ficar tipo >> #vetor.pop(); >> #insertionsortRC(vetor); >> #que ai no inicio da chamada eu uso o int n = vetor.size(); igual ao >> formato iterativo. >> #Bem, espero não estar sendo muito confuso na pergunta e que a função >> funcione. >> #Mas imagino que deve ser super simples isso. >> >> Agradeço a atenção desde ja :) >> >> -- >> Grato >> Augusto C. A. Ribas >> >> Site Pessoal: http://recologia.com.br/<http://augustoribas.heliohost.org> >> Github: https://github.com/Squiercg >> Lattes: http://lattes.cnpq.br/7355685961127056 >> >> _______________________________________________ >> R-br mailing list >> R-br@listas.c3sl.ufpr.br >> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça >> código mínimo reproduzível. >> > > _______________________________________________ > R-br mailing list > R-br@listas.c3sl.ufpr.br > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça > código mínimo reproduzível. > -- Grato Augusto C. A. Ribas Site Pessoal: http://recologia.com.br/ <http://augustoribas.heliohost.org> Github: https://github.com/Squiercg Lattes: http://lattes.cnpq.br/7355685961127056