Parte I: Conceitos Básicos de Programação no R

Algoritmos para Cálculos Matriciais

A motivação dese capítulo é implementar funções que realizam cálculos matriciais e com isso exercitar loops um dentro do outro. Assim como no capítulo anterior, primeiro faremos os pseudo-códigos e então estes serão implementados nos exercícios propostos ao final do capítulo.

Primeiro serão apresentadas algumas operações entre vetores. Em seguida será visto operações também envolvendo matrizes.

Multiplicação de vetor por escalar

Definição: Sejam \(v = (v_1, v_2, \ldots, v_n) \in \mathbb{R}^n\) e \(\alpha \in \mathbb{R}\). A multiplicação do vetor \(v\) pelo escalar \(\alpha\) é o vetor \(w = \alpha v\) definido por \(w = (\alpha v_1, \alpha v_2, \ldots, \alpha v_n) \in \mathbb{R}^n\).

Queremos escrever um pseudo-código que recebe como entrada um vetor v e um escalar a e retorna o vetor definido por \(w = a v\). Para isso basta percorrer o vetor v multiplicando cada posição pelo escalar a. Veja como isso pode ser feito no pseudo-código a seguir.


Entrada: v = array que guarda as coordenadas de um vetor, a = número real.

Saída: array definido pelo produto a com v.

1. Defina n como o tamanho do vetor v;
2. Inicie o vetor w como nulo;
3. Inicie i = 1;
4. Faça w[i] = a*v[i];
5. Incremente i: i = i + 1;
6. Se i < = n, volte para a linha 4;
7. Retorne w.

Soma entre vetores

Definição: Sejam \(v = (v_1, v_2, \ldots, v_n) \in \mathbb{R}^n\) e \(u = (u_1, u_2, \ldots, u_n) \in \mathbb{R}^n\). A soma entre os vetores \(v\) e \(u\) é o vetor \(w = v+u\) definido por \(w = (v_1 + u_1, v_2 + u_2, \ldots, v_n + u_n) \in \mathbb{R}^n\).

Queremos escrever um pseudo-código que recebe como entrada dois vetores \(v\) e \(u\) e retorna o vetor definido pela soma entre eles. Veja que para essa operação ser realizada é preciso que ambos os vetores tenham mesma dimensão. Para encontrar a soma entre os dois vetores de mesma dimensão basta somar cada posição uma a uma. Veja o pseudo-código a seguir.


Entrada: v = array que guarda as coordenadas de um vetor, u = array que guarda as coordenadas de outro vetor.

Saída: array com os elementos do vetor definido pela soma de v com u.

1. Defina n como o tamanho do vetor v;
2. Defina k como o tamanho do vetor u;
3. Se n e k forem diferentes, retorne uma mensagem de erro e FIM.
4. Inicie o vetor w como nulo;
5. Inicie i = 1;
6. Faça w[i] = v[i]*u[i];
7. Incremente i: i = i + 1;
8. Se i < = n, volte para a linha 6;
9. Retorne w.

Subtração entre vetores

Definição: Sejam \(v = (v_1, v_2, \ldots, v_n) \in \mathbb{R}^n\) e \(u = (u_1, u_2, \ldots, u_n) \in \mathbb{R}^n\). A substração do vetor \(v\) por \(u\) é o vetor \(w = v-u\) definido por \(w = (v_1 - u_1, v_2 - u_2, \ldots, v_n - u_n) \in \mathbb{R}^n\).

O pseudo-código que recebe como entrada dois vetores e retorna o vetor definido pela subtração entre eles pode ser feito de duas maneiras. A primeira alternativa é fazer um pseudo-código análogo ao definido para a soma entre dois vetores. A segunda alternativa é combinar a multiplicação de um vetor por um escalar com a soma entre dois vetores: primeiro multiplica-se o vetor \(u\) pelo escalar \(-1\) e em seguida soma o resultado com o vetor \(v\).

Produto interno

Definição: Sejam \(v = (v_1, v_2, \ldots, v_n) \in \mathbb{R}^n\) e \(u = (u_1, u_2, \ldots, u_n) \in \mathbb{R}^n\). O produto interno entre \(v\) e \(u\) é o número real definido por: \[<v,u> = v_1u_1 + v_2u_2 + \ldots + v_nu_n = \sum_{i=1}^n v_iu_i.\]

Queremos escrever o pseudo-código que recebe como entrada dois vetores \(v\) e \(u\) e retorna o produto interno entre eles. Veja que essa operação só é possível se ambos os vetores tiverem mesma dimensão. A ideia é percorrer as posições dos vetores, multiplicando posição a posição e guardando a soma em uma variável local. Veja o pseudo-código a seguir.


Entrada: v = array que guarda as coordenadas de um vetor, u = array que guarda as coordenadas de outro vetor.

Saída: o valor numérico do produto interno entre u e v.

1. Defina n como o tamanho do vetor v;
2. Defina k como o tamanho do vetor u;
3. Se n e k forem diferentes, retorne uma mensagem de erro e FIM.
4. Inicie p = 0;
5. Inicie i = 1;
6. Incremente p: p = p + v[i]*u[i];
7. Incremente i: i = i + 1;
8. Se i < = n, volte para a linha 6;
9. Retorne p.

Multiplicação de matriz por escalar

Definição: Sejam \(A\) uma matriz de dimensão \(n \times m\) e \(\alpha \in \mathbb{R}^n\) um escalar. A multiplicação de \(A\) pelo escalar \(\alpha\) é a matriz \(M = \alpha A\) de dimensão \(n \times m\) onde cada posição \((i,j)\) é definida por \(M_{i,j} = \alpha A_{i,j}\).

Queremos escrever um pseudo-código que recebe como entrada uma matriz \(A\) e um escalar \(a\) e retorna a matriz definida por \(M = a A\). Para isso basta percorrer a matriz \(A\) multiplicando cada posição pelo escalar \(a\). Mas lembre-se que para percorrer uma matriz é preciso usar dois loops, um dentro do outro. Veja como isso pode ser feito no pseudo-código a seguir.


Entrada: A = matriz de números reais; a = número real.

Saída: uma matriz definida pelo produto de a com A.

1. Defina n número de linhas da matriz A;
2. Defina m número de colunas da matriz A;
3. Inicie uma matriz M de dimensão n x m. 
4. Inicie i = 1;
5. Inicie j = 1;
6. Faça M[i,j] = a*A[i,j];
7. Incremente j: j = j + 1;
8. Se j < = m volte para a linha 6;
9. Incremente i: i = i + 1;
10. Se i < = n volte para a linha 5;
11. Retorne M.

Reparou que temos dois loops? O primeiro está entre as linhas 6-8 e o outro entre as linhas 5-10. Como isso pode ser implementado em uma linguagem de programação, em particular na linguagem R?

Soma entre matrizes

Definição: Sejam \(A\) e \(B\) duas matrizes de dimensão \(n \times m\). A soma das matrizes \(A\) e \(B\) é a matriz \(M = A+B\) de dimensão \(n \times m\) onde cada posição \((i,j)\) é definida por \(M_{i,j} = A_{i,j} + B_{i,j}\).

Queremos escrever o pseudo-código que recebe como entrada duas matrizes \(A\) e \(B\) e retorna a matriz definida pela soma delas. Novamente como teremos que percorrer as linhas e colunas das matrizes será preciso usar dois loops, um dentro de outro. Veja no pseudo-código a seguir como isso pode ser feito.


Entrada: A = matriz de números reais; B = matriz de números reais.

Saída: uma matriz definida pelo soma de A com B.

1. Defina n número de linhas da matriz A;
2. Defina m número de colunas da matriz A;
3. Defina l número de linhas da matriz B;
4. Defina c número de colunas da matriz B;
5. Se n é diferente de l, retorne uma mensagem de erro e FIM.
6. Se m é diferente de c, retorne uma mensagem de erro e FIM.
7. Inicie uma matriz M de dimensão n x m. 
8. Inicie i = 1;
9. Inicie j = 1;
10. Faça M[i,j] = A[i,j] + B[i,j];
11. Incremente j: j = j + 1;
12. Se j < = m volte para a linha 10;
13. Incremente i: i = i + 1;
14. Se i < = n volte para a linha 9;
15. Retorne M.

Subtração entre Matrizes

Definição: Sejam \(A\) e \(B\) duas matrizes de dimensão \(n \times m\). A subtração da matriz \(A\) pela matriz \(B\) é a matriz \(M = A-B\) de dimensão \(n \times m\) onde cada posição \((i,j)\) é definida por \(M_{i,j} = A_{i,j} - B_{i,j}\).

Assim como a subtração de vetores, o pseudo-código que recebe como entrada duas matrizes e retorna a matriz definida pela subtração entre elas pode ser feito de duas maneiras. A primeira alternativa é fazer um pseudo-código análogo ao definido para a soma entre matrizes. A segunda alternativa é combinar a multiplicação de uma matriz por um escalar com a soma entre duas matrizes: primeiro multiplica-se a matriz \(B\) pelo escalar \(-1\) e em seguida soma o resultado com a matriz \(A\).

Transposição de Matrizes

Definição: Seja \(A\) uma matriz \(n \times m\). A transposta da matriz \(A\) é a matriz \(A^T\) de dimensão \(m \times n\) onde cada posição \((i,j)\) é definida por \(A^T_{i,j} = A_{j,i}\).

Queremos escrever um pseudo-código que recebe como entrada uma matriz \(A\) e retorna a sua transposta. Veja que só precisamos percorrer as linhas e colunas da matriz e guardar na posição \((i,j)\) o elemento guardando na posição \((j,i)\) da matriz de entrada. O pseudo-código a seguir realiza essa tarefa.


Entrada: A = matriz de números reais.

Saída: uma matriz definida pela transposta de A.

1. Defina n número de linhas da matriz A;
2. Defina m número de colunas da matriz A;
3. Inicie uma matriz M de dimensão m x n; 
4. Inicie i = 1;
5. Inicie j = 1;
6. Faça M[i,j] = A[j,i];
7. Incremente j: j = j + 1;
8. Se j < = m volte para a linha 6;
9. Incremente i: i = i + 1;
10. Se i < = n volte para a linha 5;
11. Retorne M.

Multiplicação entre matriz e vetor

Definição: Seja \(A\) uma matriz \(n \times m\) e \(v \in \mathbb{R}^m\) um vetor. Considere \(a_i \in \mathbb{R}^m\) o vetor formado pela \(i\)-ésima linha da matriz \(A\). O produto entre a matriz \(A\) e o vetor \(v\) é o vetor \(w = Av \in \mathbb{R}^n\) tal que cada posição é definida por \(w_i = <a_i,v>\).

A partir da definição acima vamos escrever um pseudo-código para uma função que recebe como entrada uma matriz \(A\) e um vetor \(v\) e retorna o vetor definido pelo produto entre eles. Vamos considerar que já sabemos calcular o produto interno entre dois vetores. Então basta percorrer as colunas da matriz e calcular o produto interno entre os vetores colunas e o vetor \(v\). Veja que as dimensões de \(A\) e \(v\) devem ser testadas para verificar se a multiplicação realmente pode ser realizada: a conta só é possível quando o número de colunas da matriz é igual ao número de elementos no vetor. O pseudo-código a seguir mostra como isso pode ser feito.


Entrada: A = matriz de números reais; v = array com os valores do vetor.

Saída: um array com os elementos do produto de A com v, isto é, Av.

1. Defina n número de linhas da matriz A;
2. Defina m número de colunas da matriz A;
3. Defina k número de elementos no array v;
4. Se m é diferente de k, retorne uma mensagem de erro e FIM.
5. Inicie um array nulo w; 
6. Inicie i = 1;
7. w[i] = produto interno entre a linha i da matriz A e o array v;
8. Incremente i: i = i + 1;
9. Se i < = n volte para a linha 7;
10. Retorne w.

Dica: Na linguagem R se o objeto A é uma matriz então A[i,] é um array do tipo "numeric" definido pela \(i\)-ésima linha da matriz A.

Multiplicação entre matrizes

Definição: Seja \(A\) uma matriz \(n \times m\) e \(B\) uma matriz \(m \times k\). Considere \(a_i \in \mathbb{R}^m\) o vetor formado pela \(i\)-ésima linha da matriz \(A\) e \(b_j \in \mathbb{R}^m\) o vetor formado pela \(j\)-ésima coluna da matriz \(B\). O produto entre a matriz \(A\) e a matriz \(B\) é a matriz \(M = AB\) de dimensão \(n \times k\) onde cada posição é definida por \(M_{i,j} = <a_i,b_j>\).

A partir da definição acima vamos escrever um pseudo-código para uma função que recebe como entrada duas matrizes \(A\) e \(B\) e retorna outra matriz definida pelo produto entre elas. Vamos considerar que já sabemos calcular o produto interno entre dois vetores. Veja que as dimensões de \(A\) e \(B\) devem ser testadas para verificar se a multiplicação realmente pode ser realizada: só podemos multiplicar \(A\) por \(B\) se o número de colunas de \(A\) for igual ao número de colunas de \(B\).


Entrada: A = matriz de números reais; B = matriz de números reais.

Saída: uma matriz definida pelo produto de A com B, isto é, AB.

1. Defina n número de linhas da matriz A;
2. Defina m número de colunas da matriz A;
3. Defina l número de linhas da matriz B;
4. Defina c número de colunas da matriz B;
5. Se m é diferente de l, retorne uma mensagem de erro e FIM.
6. Inicie uma matriz M de dimensão n x c. 
7. Inicie i = 1;
8. Inicie j = 1;
9. Faça M[i,j] = produto interno entre a linha i da matriz A e a coluna j de B;
10. Incremente j: j = j + 1;
11. Se j < = m volte para a linha 9;
12. Incremente i: i = i + 1;
13. Se i < = n volte para a linha 8;
14. Retorne M.