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.
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.
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.
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\).
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.
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?
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.
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\).
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.
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
.
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.