Lab_5_Vectorization

Author

Henrique Alvarenga

Published

11 de setembro de 2024

Aula: Vetorização em R

Introdução

Nesta aula, vamos explorar o conceito de vetorização em R, uma característica poderosa que permite realizar operações em grandes conjuntos de dados de forma eficiente e rápida. Vamos comparar o desempenho das operações vetoriais com loops for e entender por que a vetorização é uma prática recomendada em R.

1. O que é Vetorização?

Vetorização é o processo de aplicar operações a vetores inteiros em uma única chamada de função, sem a necessidade de escrever loops explícitos. Em R, muitas funções são vetorizadas, o que significa que elas podem processar vetores completos de dados de uma só vez.

1.1. Exemplo Simples de Vetorização

Vamos começar com um exemplo simples, onde somamos dois vetores:

Code
# Vetores
a <- c(1, 2, 3, 4, 5)
b <- c(10, 20, 30, 40, 50)

# Soma vetorizada
c <- a + b
print(c)
[1] 11 22 33 44 55

Nesta operação, cada elemento do vetor a é somado ao elemento correspondente do vetor b em uma única linha de código.

2. Comparação de Desempenho: Vetorização vs Loops for

Vamos agora comparar o tempo de execução de operações vetoriais e loops for usando a função system.time() para medir o desempenho.

A função system.time() so R é usada para medir o tempo de execução de uma expressão ou conjunto de expressões. Ela retorna o tempo em segundos necessário para executar o código especificado, dividido em três componentes principais:

  • user time: O tempo gasto pela CPU executando o código no espaço do usuário. Esse tempo inclui todas as operações aritméticas, lógicas, e chamadas de funções dentro do seu código.
  • system time: O tempo gasto pela CPU executando operações do sistema, como chamadas de sistema ou manipulação de arquivos.
  • elapsed time: O tempo total decorrido, ou seja, o tempo que passou no “mundo real” desde o início até o fim da execução da expressão. Isso inclui tanto o user time quanto o system time, além de qualquer tempo em que o processo possa ter estado em espera (por exemplo, aguardando por recursos como E/S).

2.1. Usando um Loop for

Vamos calcular a soma de dois vetores usando um loop for:

Code
# definindo o tamanho dos vetores que seão criados
size <- 100000000


# Vetores com x  elementos
a <- rnorm(size)
b <- rnorm(size)

# Criando um vetor para receber a soma dos vetores a e b:
# A linha abaixo serve para pré-alocar memória para o vetor c, que armazenará os resultados da soma dos elementos de a e b.
c <- numeric(size)


# Tempo de execução do loop for
tempo_for <- system.time({for (i in 1:size) 
                            {c[i] <- a[i] + b[i]}
                          })

print(tempo_for)
   user  system elapsed 
  2.926   0.118   3.046 

2.2. Usando Vetorização

Agora, vamos calcular a soma dos mesmos vetores usando vetorização:

Code
# Tempo de execução da vetorização
tempo_vetorizado <- system.time({
  c <- a + b
})

print(tempo_vetorizado)
   user  system elapsed 
  0.031   0.033   0.064 

2.3. Comparação dos Resultados

Depois de rodar ambos os códigos, compare os resultados:

Code
print(tempo_for)
   user  system elapsed 
  2.926   0.118   3.046 
Code
print(tempo_vetorizado)
   user  system elapsed 
  0.031   0.033   0.064 

Discussão: - Normalmente, a vetorização é significativamente mais rápida do que o uso de loops for. Isso ocorre porque R é otimizado para realizar operações em vetores inteiros de forma mais eficiente. - Explique que o loop for itera sobre cada elemento individualmente, o que consome mais tempo, enquanto a vetorização opera diretamente sobre o vetor como um todo.

3. Aplicações Práticas da Vetorização

3.1. Operações Matemáticas

Vetorização é útil em operações matemáticas complexas, como a multiplicação de matrizes:

Code
# Matrizes
mat1 <- matrix(1:9, nrow = 3)
mat2 <- matrix(9:1, nrow = 3)

# Multiplicação vetorizada de matrizes
result <- mat1 %*% mat2
print(result)
     [,1] [,2] [,3]
[1,]   90   54   18
[2,]  114   69   24
[3,]  138   84   30

3.2. Funções Estatísticas

Funções estatísticas em R, como média, desvio padrão, etc., são vetorizadas:

Code
# Vetor de dados
dados <- rnorm(1000000)

# Média vetorizada
media <- mean(dados)
print(media)
[1] -0.0001008983

4. Conclusão

A vetorização é uma técnica poderosa em R que pode melhorar significativamente o desempenho dos seus scripts. Sempre que possível, procure formas de evitar loops explícitos e usar funções vetorizadas, especialmente ao trabalhar com grandes conjuntos de dados.

Resumo: - Vetorização permite operações mais rápidas e eficientes. - Loops for são mais lentos e devem ser evitados quando possível. - R oferece muitas funções vetorizadas que podem ser usadas para otimizar o desempenho do código.

5. Exercícios Práticos

  1. Exercício 1: Calcular a raiz quadrada de cada elemento de um vetor com 1 milhão de elementos usando vetorização e com um loop for. Compare os tempos de execução.
  2. Exercício 2: Multiplicar dois vetores de 500 mil elementos e comparar o desempenho entre vetorização e um loop for.
  3. Exercício 3: Criar uma função vetorizada personalizada para calcular o quadrado de cada elemento em um vetor e testar com diferentes tamanhos de vetor.