image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Fernando Araujo
Fernando Araujo19/09/2024 14:14
Compartilhe

<Direto ao Ponto 48> Estruturas de Dados - Matrizes

  • #Informática Básica

Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )

 

 

Olá, dev!

 

Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Ele vai tratar de mais uma das principais estruturas de dados, as matrizes.

 

 

Sumário

 

1. Introdução

2. Os vetores

3. As matrizes

4. Exemplos de aplicações implementadas com matrizes

5. Considerações finais

6. Referências

 

 

1 – Introdução

 

Eu criei a série de artigos DIRETO AO PONTO com o objetivo de apresentar, de forma simples e direta, conhecimentos básicos da programação e de computação, principalmente, para os iniciantes.

 

Aqui, são tratados de temas como lógica de programação, linguagens, hardware dos computadores, história da computação e assuntos relacionados à plataforma da DIO, como a escrita de artigos e os desafios de código.

 

Neste artigo, eu vou falar sobre as matrizes e as aplicações que as usam na implementação. Dentre estas aplicações, estão os conjuntos de dados em forma tabular e o Processamento de Imagens.

 

 

2 – Os vetores e as matrizes

 

image


No penúltimo artigo desta série, eu falei dos vetores (arrays), especificamente, os arrays unidimensionais.

 

Em um nível de complexidade acima estão os arrays multidimensionais, com 2 dimensões ou mais. O tipo mais comum é a matriz, ou array bidimensional, que tem muitas aplicações na programação, como o uso de tabelas ou em processamento de imagens.

 

Este artigo tratará apenas dos vetores bidimensionais, ou matrizes, mas a mesma lógica aplicada para duas dimensões pode ser estendida para mais dimensões.

 

Na programação, uma matriz apresenta a mesma representação da matriz usada na matemática. Ou seja, uma matriz é um conjunto de valores (dados) dispostos em linhas e colunas.

 

Na matemática, são usados números nas matrizes, mas na programação, podem ser usados outros tipos de dados, como strings, por exemplo.

 

A figura a seguir ilustra uma matriz numérica usada em programação:

 

 image

 

 

A figura mostra uma matriz com 3 linhas e 4 colunas, tendo 12 (3 x 4) elementos numéricos inteiros.

 

Existe uma indicação dos índices das linhas e das colunas da matriz. Note que os índices se iniciam em 0 (zero), ao invés de 1, como é na matemática. Desta forma:

Primeira linha, índice 0; segunda linha, índice 1, e assim por diante.

Primeira coluna, índice 0; segunda coluna, índice 1, e assim por diante.

 

Assim, o elemento do canto superior esquerdo da matriz, número -20, fica na linha 0 e coluna 0 e pode ser representado pelos índices [0][0], onde o primeiro índice indica a linha e o segundo, a coluna matriz[linha][coluna] – matriz pode ser o nome da variável do tipo matriz.

 

Na memória, os valores são armazenados sequencialmente, como os vetores, uma linha de cada vez, na seguinte organização:

 

image


Primeiro, são armazenados os valores da primeira linha, , sequencialmente, seguidos dos valores da segunda linha, e assim por diante. Assim, o acesso aos elementos da matriz, por meio de 2 índices também é rápido, como nos vetores.

 

A representação de uma variável do tipo matriz (ou vetor bidimensional) envolve o tipo dos dados (inteiros, reais, strings), o tamanho da matriz (suas dimensões, número de linhas e de colunas) e o tipo da variável (array bidimensional).

 

Em geral, o processamento de uma matriz em um código envolve o uso de duas instruções de repetição aninhadas, uma para varrer as linhas da matriz e outra para varrer as colunas de cada linha, da seguinte forma:

 

// Imprimindo a matriz
printf("Matriz:\n");
for (int i = 0; i < 3; i++) { // varre todas as linhas da matriz
 printf("[ ");
 for (int j = 0; j < 3; j++) { // varre todas as colunas da linha atual da matriz
     printf("%d ", matriz[i][j]); // imprime o elemento [ i ][ j ] – linha i, coluna j
 }
 printf("]\n");
}

 

Geralmente, são usados os índices i e j, mas eu prefiro usar lin e col, pois eles são mais significativos em programas de processamento de imagens ou de computação gráfica, que eu costumo usar.

 

OBS: Esta forma de usar comandos de repetição aninhados para percorrer elemento por elemento de uma matriz é muito custosa computacionalmente e algumas linguagens modernas (C#, R, Ruby, Haskell, Go, Swift) já oferecem outra forma mais adequada de se manipular vetores e matrizes, tratando-os como um objeto único. O Matlab já oferecia isso há anos e Python também oferece, por meio do módulo Numpy.

 

É o fatiamento (slicing), que permite usar fatias (slices) de uma matriz (ou um vetor) apenas pela indicação de limites dos índices. Veja exemplos em Python (com o módulo Numpy importado):

 

import numpy as np
 
# Criar uma matriz
matriz = np.array([[1, 2, 3],
                          [4, 5, 6],
                          [7, 8, 9]])
 
# É usada a representação de [linhas, colunas]
 
# Selecionar todas as linhas ( : ) e as 2 primeiras colunas ( :2 )
fatia1 = matriz[:, :2] 
 
# Resultado: [[1 2]
#                   [4 5]
#                   [7 8]]
 
# Selecionar as 2 primeiras linhas ( :2 ) e as 2 primeiras colunas ( :2 )
faftia2 = matriz[:2, :2] 
 
# Resultado: [[1 2]
#                   [4 5]]
 
# Selecionar a última linha ( -1 ) inteira - ou todas as colunas ( : )
fatia3 = matriz[-1, :] 
 
# Resultado: [7 8 9]

  

As matrizes são usadas mais comumente para os seguintes tipos de aplicações:

 

·        Álgebra Linear: resolução de sistemas de equações lineares e transformações lineares;

 

·        Processamento de Imagens: Imagens são representadas como matrizes de pixels, comuns em operações como filtragem, suavização, escalonamento e rotação;

 

·        Aprendizado de Máquina e Inteligência Artificial: os dados são representados como matrizes, que são usadas em algoritmos de redes neurais e máquinas de vetores de suporte, por exemplo;

 

·        Computação Gráfica: usadas em transformações geométricas (translação, rotação e escalonamento) de objetos 2D e 3D (ver a matriz de rotação da figura acima);

 

·        Análise de Redes: usadas para representar grafos e realizar operações como o caminho mais curto entre dois nós;

 

·        Estatística: usadas em operações como correlação e regressão.

 

·        Robótica: usadas para representar a posição e orientação de robôs e seus componentes (braço robótico, por exemplo).

 

 

Outras aplicações importantes são os jogos digitais (incluídos em Computação Gráfica 2D) e os mapas digitais (também podem estar em Computação Gráfica 2D).

 

As operações básicas que podem ser realizadas com uma matriz são (em pseudo-código, independentemente de alguma linguagem de programação específica:

 

Criação (ou declaração) – nomeia a variável, informa o tipo e reserva espaço para os elementos:

int matriz[3][4] – declara uma matriz de inteiros com 3 linhas e 4 colunas

 

Inicialização – ao declarar a matriz, já informar os elementos dela:

int matriz[2][2] = {    

                              {11, 62},

                              {-3, 20}

                           };

 

Acesso – acessar o valor armazenado em uma posição da matriz:

temp = matriz[1][2]; // o valor acessado é 50 (segunda linha, terceira coluna).

print( matriz[2][1] ) // imprime o valor 70 (terceira linha, segunda coluna)

 

Atribuição – atribuir um valor para uma posição da matriz:

matriz[0][3] = 100; // atribui o valor 100 ao elemento da primeira linha, quarta coluna), que era 30.

 

 

3 – Exemplos de aplicações implementadas com vetores

 

A seguir, seguem alguns programas básicos que implementam vetores, em linguagens diferentes:

 

Linguagem Java – imprimir uma matriz de inteiros 2 x 3

 

public class Matriz {
 public static void main(String[] args) {
     // Inicializando a matriz 2x3
     int[ ][ ] matriz = {
         {1, 2, 3},
         {4, 5, 6}
     };
 
     // Imprimindo a matriz
     System.out.println("Matriz:");
     for (int i = 0; i < matriz.length; i++) {
         System.out.print("[ ");
         for (int j = 0; j < matriz[ i ].length; j++) {
             System.out.print(matriz[ i ][ j ] + " ");
         }
         System.out.println("]");
     }
 }
}
 

 

Saída

 

Matriz:

[ 1 2 3 ]

[ 4 5 6 ]

 

 

Na linguagem Python – inicialize uma matriz 4x4 de inteiros, imprima a matriz, a primeira linha e a última coluna

 

# Inicializando a matriz
matriz = [
 [1, 2, 3, 4],
 [5, 6, 7, 8],
 [9, 10, 11, 12],
 [13, 14, 15, 16]
]
 
# Imprimindo a matriz completa
print("Matriz:")
for linha in matriz:
 print("[", end=" ")
 for elemento in linha:
     print(elemento, end=" ")
 print("]")
 
# Imprimindo a primeira linha
print("\nPrimeira linha:")
print("[", end=" ")
for elemento in matriz[0]:
 print(elemento, end=" ")
print("]")
 
# Imprimindo a última coluna
print("\nÚltima coluna:")
print("[", end=" ")
for linha in matriz:
 print(linha[-1], end=" ")
print("]")


Saída

 

Matriz:

[ 1 2 3 4 ]

[ 5 6 7 8 ]

[ 9 10 11 12 ]

[ 13 14 15 16 ]

 

Primeira linha:

[ 1 2 3 4 ]

 

Última coluna:

[ 4 8 12 16 ]

 

 

Na linguagem C – calcule a soma dos elementos da uma matriz 3x3 de inteiros

 

#include <stdio.h>
 
int main() {
 // Inicializando a matriz
 int matriz[3][3] = {
     {1, 2, 3},
     {4, 5, 6},
     {7, 8, 9}
 };
 
 int soma = 0;
 
 // Calculando a soma dos elementos da matriz
 for (int i = 0; i < 3; i++) {
     for (int j = 0; j < 3; j++) {
         soma += matriz[i][j];
     }
 }
 
 // Imprimindo a matriz
 printf("Matriz:\n");
 for (int i = 0; i < 3; i++) {
     printf("[ ");
     for (int j = 0; j < 3; j++) {
         printf("%d ", matriz[i][j]);
     }
     printf("]\n");
 }
 
 // Imprimindo a soma dos elementos
 printf("Soma dos elementos da matriz: %d\n\n", soma);
 
 return 0;
}

 

Saída

 

Matriz:

[ 1 2 3 ]

[ 4 5 6 ]

[ 7 8 9 ]

 

Soma dos elementos da matriz: 45

 

 

4 – Considerações finais

 

Este é mais um artigo da série DIRETO AO PONTO, que eu estou escrevendo para a DIO. Neste artigo eu tratei das matrizes, um caso particular dos arrays multidimensionais.

 

A matriz é usada em muitas aplicações na programação, como nas tabelas de armazenamento de dados ou em Processamento de Imagens, por exemplo.

 

Este artigo tratou apenas dos vetores bidimensionais, ou matrizes, mas a lógica pode ser aplicada para mais dimensões, como as matrizes usadas em Computação Gráfica 3D.

 

Na programação, uma matriz é um conjunto de valores (dados) dispostos em linhas e colunas.

 

Os elementos de uma matriz podem ser facilmente acessados por 2 comandos de repetição aninhados, um para varres as linhas da matriz e outro para varrer as colunas de cada linha.

 

Linguagens modernas já implementam o fatiamento de matrizes, permitindo que partes delas (fatias) sejam usadas em operações, sem a necessidade de varredura por comandos de repetição aninhados, mais custosos.

 

No próximo artigo, vamos falar das listas, muito usadas na programação.

 

 

5 – Referências

 

Praticamente todo o conteúdo deste artigo foi tirado do que eu aprendi (e me lembro) sobre o assunto desde o início da minha carreira como programador, desde os anos 80 até agora.

 

Para a elaboração de códigos de linguagens que eu não tenho muita experiência em programar (Java), eu consultei as ferramentas ChatGPT e Copilot.

 

Artigos desta série: ( < ) Anterior | Índice | Seguinte ( > )

Compartilhe
Comentários (2)
Fernando Araujo
Fernando Araujo - 20/09/2024 08:49

Obrigado, Luiz!!!

Luiz Café
Luiz Café - 19/09/2024 19:30

Parabéns pelo seu artigo Fernando! Você possui uat explicação didática notáveis. Certamente sua contribuição ajudará profissionais de todas as senioridades a aprender cada vez mais.