You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Dec 22, 2024. It is now read-only.
Copy file name to clipboardExpand all lines: 1-Porque_CPP.Rmd
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -226,7 +226,7 @@ A figura \@ref(fig:cppfunction) mostra a anatomia de uma função em C++. Ela é
226
226
***Tipo de Retorno**: toda função em C++ deve especificar, antes do seu nome, o tipo de dado que é retornado pela função.
227
227
***Valor de Retorno**: toda função em C++ deve especificar explicitamente qual valor retornar com um `return`. No R podemos ser mais desleixados pois o valor de retorno será sempre a ultima declaração da função. Em C++ isto não funciona. A lógica de C++ é que a função termina quando ela atinge o primeiro `return` e retorna o dado/variável especificado(a).
228
228
229
-
```{r cppfunction, echo=FALSE, fig.cap='Anatomia de uma função em C++'}
229
+
```{r cppfunction, echo=FALSE, fig.cap='Anatomia de uma função em C++. Figura adaptada da Vinheta Oficial Introdutória do `{Rcpp}` de Dirk Eddelbuettel'}
Além dos tipos de dados, `{Rcpp}` também tem uma ampla gama de "açúcares" sintáticos (*syntactic sugar*) para as mais variadas operações e funções. Antes de tentar criar algo do zero veja se não há um [`{Rccp}` Sugar para isso já implementado na vinheta](http://dirk.eddelbuettel.com/code/rcpp/Rcpp-sugar.pdf).
347
+
344
348
## Exemplo -- Multiplicação de Matrizes
345
349
346
350
Está na hora de colocarmos o que vimos em prática. Nesse caso vamos comparar multiplicar duas matrizes usando o R (operador `%*%`) e usando o C++ com `{Rcpp}`.
@@ -387,15 +391,14 @@ Aqui eu vou ser um pouco abusado no exemplo e já vou pular direto para um algor
387
391
388
392
Soma dos quadrados é algo que ocorre bastante em computação científica, especialmente quando estamos falando de regressão, mínimos quadrados, ANOVA etc. Vamos fazer três implementações de uma função que aceita como parâmetro um vetor de números reais (C++ `double` / R `numeric`) e computa a soma de todos os elementos do vetor elevados ao quadrado:
389
393
390
-
1.`sum_of_squares_R()`: feita no R com vetorização usando o `{purrr}`.
394
+
1.`sum_of_squares_R()`: feita no R com vetorização.
391
395
2.`sum_of_squares_rcpp()`: feita de maneira ingênua no C++ com dois loops `for` triviais que (1) multiplica cada elemento consigo mesmo e (2) adiciona todos os elementos do vetor à uma variável `double`.
392
-
3.`sum_of_squares_cpp20()`: solução elegante que usa `transform_reduce` para transformar todos os elementos multiplicando-os por si mesmos e ao mesmo tempo somando todos os elementos.
396
+
3.`sum_of_squares_rcpp20()`: solução elegante que usa `transform_reduce` para transformar todos os elementos multiplicando-os por si mesmos e ao mesmo tempo somando todos os elementos.
Mais um sucesso! Ganho de 600x `r emo::ji("exploding_head")`para um vetor com `r format(n, big.mark = ".", decimal.mark = ",")` elementos! O mais impressionante é que uma solução simples e ingênua com dois loops `for` em C++ ficou quase tão rápida quanto uma solução C++ usando `transform_reduce()`!
458
+
Aqui vemos como a vetorização do R funciona muito bem. É mais rápida que quase todas as implementações em `{Rcpp}`, exceto quando usamos o [`{Rcpp}` Sugar](http://dirk.eddelbuettel.com/code/rcpp/Rcpp-sugar.pdf) já que temos um ganho de 2x para um vetor com `r format(n, big.mark = ".", decimal.mark = ",")` elementos.
450
459
451
460
## `{Rcpp}` e Boost
452
461
@@ -555,6 +564,7 @@ Diversos materiais me ajudaram a aprender e criar esse conjunto de tutoriais de
555
564
* Livro [Seamless R and C++ Integration with Rcpp](http://www.rcpp.org/book/) do criador do ecossitema `{Rcpp}` Dirk Eddelbuettel.
556
565
* [Capítulo 25 -- Rewriting R code in C++](https://adv-r.hadley.nz/rcpp.html) do livro Advanced R do Hadley Wickham.
557
566
* [Galeria de exemplos de `{Rcpp}`](https://gallery.rcpp.org).
567
+
* [Vinheta do `{Rcpp}` Sugar](http://dirk.eddelbuettel.com/code/rcpp/Rcpp-sugar.pdf).
558
568
* Livro [Rcpp for Everyone](https://teuder.github.io/rcpp4everyone_en/) do Masaki E. Tsuda.
559
569
* [Documentação Não-Oficial](https://thecoatlessprofessor.com/programming/cpp/unofficial-rcpp-api-documentation/) de `{Rcpp}` do James Balamuta (também conhecido como TheCoatlessProfessor).
560
570
* Vídeo do [Dirk Eddelbuettel na conferência useR! 2020 sobre `{Rcpp}`](https://youtu.be/57H34Njrns4).
Copy file name to clipboardExpand all lines: 5-cpp11.Rmd
+25-20Lines changed: 25 additions & 20 deletions
Original file line number
Diff line number
Diff line change
@@ -133,50 +133,54 @@ tibble::tribble(
133
133
134
134
Vamos reutilizar o exemplo `sum_of_squares` do [tutorial 2. Como incorporar C++ no R - {Rcpp}](2-Rcpp.html).
135
135
136
-
Soma dos quadrados é algo que ocorre bastante em computação científica, especialmente quando estamos falando de regressão, mínimos quadrados, ANOVA etc. Vamos comparar a função usando dois loops `for`^[`{cpp11}` ainda não possui suporte à funcionalidades de C++20 -- `std::transform_reduce()`.] tanto no `{Rcpp}` quanto no `{cpp11}`. Lembrando que esta implementação será uma função que aceita como parâmetro um vetor de números reais (C++ `double` / R `numeric`) e computa a soma de todos os elementos do vetor elevados ao quadrado.
136
+
Soma dos quadrados é algo que ocorre bastante em computação científica, especialmente quando estamos falando de regressão, mínimos quadrados, ANOVA etc. Vamos comparar a função usando um [`std::acummulate`](https://en.cppreference.com/w/cpp/algorithm/accumulate) de C+11 STL^[`{cpp11}` ainda não possui suporte à funcionalidades de C++20 -- `std::transform_reduce()`.] tanto no `{Rcpp}` quanto no `{cpp11}`. Lembrando que esta implementação será uma função que aceita como parâmetro um vetor de números reais (C++ `double` / R `numeric`) e computa a soma de todos os elementos do vetor elevados ao quadrado.
137
+
138
+
Para ser uma comparação justa, vamos usar também do [tutorial 2. Como incorporar C++ no R - {Rcpp}](2-Rcpp.html), a função `sum_of_squares_rcpp_sugar()` que usa [`{Rcpp}` Sugar](http://dirk.eddelbuettel.com/code/rcpp/Rcpp-sugar.pdf).
137
139
138
140
```{Rcpp sum_of_squares_rcpp}
139
141
#include <Rcpp.h>
140
-
// [[Rcpp::plugins("cpp11")]]
142
+
#include <numeric>
141
143
142
144
using namespace Rcpp;
143
145
146
+
// [[Rcpp::plugins("cpp11")]]
147
+
144
148
// [[Rcpp::export]]
145
149
double sum_of_squares_rcpp(NumericVector v){
146
150
double sum_of_elems = 0;
147
151
148
-
// primeiro for multiplicando cada elemento consigo mesmo
// primeiro for multiplicando cada elemento consigo mesmo
171
-
for(int i=0; i < v.size(); i++){
172
-
v[i] = v[i] * v[i];
173
-
}
174
-
175
-
// segundo for somando todos os elementos
176
-
for(auto it = v.cbegin(); it != v.cend(); ++it)
177
-
sum_of_elems += *it;
177
+
sum_of_elems += std::accumulate(v.cbegin(),
178
+
v.cend(),
179
+
0.0,
180
+
[] (double i, double j) {return i + (j * j);});
178
181
return sum_of_elems;
179
182
}
183
+
180
184
```
181
185
182
186
```{r bench-sum_of_squares}
@@ -186,11 +190,12 @@ v <- rnorm(n)
186
190
bench::mark(
187
191
Rcpp = sum_of_squares_rcpp(v),
188
192
cpp11 = sum_of_squares_cpp11(v),
193
+
Rcppsugar = sum_of_squares_rcpp_sugar(v),
189
194
check = FALSE,
190
195
)
191
196
```
192
197
193
-
Apesar de ser uma nova proposta o `{cpp11}`, pelo menos neste simples benchmark e no meu computador, possui um desempenho bem inferior ao do `{Rcpp}`: 60x mais lerdo...
198
+
Quando usada a biblioteca padrão C++11 STL tanto `{cpp11}` quanto `{Rcpp}` e `{Rcpp}` Sugar, pelo menos neste simples benchmark e no meu computador, possuem um desempenho similar para um vetor com `r format(n, big.mark = ".", decimal.mark = ",")` elementos. É claro que solução do `{Rcpp}` Sugar é muito mais elegante e simples com uma única linhana função.
0 commit comments