Capítulo 16: Operações Avançadas em Matrizes (Cálculos e Agregações)

🎯 Objetivo da Aula

Em sistemas de Business Intelligence (BI) e ERPs corporativos, uma tabela em memória não serve apenas para guardar valores: precisamos extrair totais consolidados por linha (ex: quanto cada filial vendeu no ano), totais por coluna (ex: quanto a empresa inteira faturou no mês de Janeiro) e cruzar matrizes de distâncias entre polos logísticos.

Nesta aula, você aprenderá a:

  1. Implementar o algoritmo de Somatório e Média por Linha.
  2. Implementar o algoritmo de Somatório e Média por Coluna.
  3. Compreender a teoria da Diagonal Principal ($L = C$) e Diagonal Secundária.
  4. Construir uma Matriz de Tarifas Cruzadas de Frete (Origem $\times$ Destino).

📥 Material de Apoio e Código-Fonte da Aula:


🏢 O Cenário Prático (Seu Desafio)

Situação: A FastLog opera rotas entre 4 Capitais Brasileiras:

  • 1: São Paulo (SP)
  • 2: Rio de Janeiro (RJ)
  • 3: Curitiba (PR)
  • 4: Belo Horizonte (MG)

Os custos de transporte entre as cidades são armazenados em uma matriz $4 \times 4$. Quando a origem e o destino são a mesma cidade (ex: SP para SP), a distância e o custo são zero (a Diagonal Principal).

Missão: Você deve construir o Cotador de Rotas Intermunicipais FastLog, permitindo que o operador consulte o valor do frete digitando apenas os números da cidade de Origem e da cidade de Destino.


🧠 Fundamentos: Algoritmos de Agregação em Matrizes

1. Somatório por Linha vs Somatório por Coluna

graph TD
    subgraph Matriz_Calculos ["Matriz de Vendas (3 Filiais x 3 Meses)"]
        M11["[1,1]"] --- M12["[1,2]"] --- M13["[1,3]"] --> SumL1["Total Linha 1: Filial SP"]
        M21["[2,1]"] --- M22["[2,2]"] --- M23["[2,3]"] --> SumL2["Total Linha 2: Filial RJ"]
        M31["[3,1]"] --- M32["[3,2]"] --- M33["[3,3]"] --> SumL3["Total Linha 3: Filial PR"]
        M11 -.-> SumC1["Total Coluna 1:<br/>Mês Jan"]
        M12 -.-> SumC2["Total Coluna 2:<br/>Mês Fev"]
        M13 -.-> SumC3["Total Coluna 3:<br/>Mês Mar"]
    end
    
    style SumL1 fill:#2980b9,stroke:#fff,color:#fff
    style SumL2 fill:#2980b9,stroke:#fff,color:#fff
    style SumL3 fill:#2980b9,stroke:#fff,color:#fff
    style SumC1 fill:#8e44ad,stroke:#fff,color:#fff
    style SumC2 fill:#8e44ad,stroke:#fff,color:#fff
    style SumC3 fill:#8e44ad,stroke:#fff,color:#fff
  • Para Somar por Linha: Fixe a linha l no laço externo, zere o acumulador totalLinha <- 0, e percorra todas as colunas c com o laço interno.
  • Para Somar por Coluna: Inverta a ordem dos laços! Fixe a coluna c no laço externo, zere o acumulador totalColuna <- 0, e percorra todas as linhas l com o laço interno.

Calculando a Média (Soma ÷ Contagem)

Uma vez que você tenha o somatório de uma linha (ou coluna), a média é simplesmente esse total dividido pela quantidade de elementos que foram somados:

1
mediaLinha <- totalLinha / totalColunas  // ex: totalLinha / 4.0, se a matriz tem 4 colunas

Mini-Exemplo — Somatório e Média de uma única linha: Imagine a Linha 1 (Filial SP) com 3 valores de faturamento mensal: [1200.00, 1500.00, 1100.00].

1
2
3
4
5
6
totalLinha <- 0.0
para c de 1 ate 3 faca
   totalLinha <- totalLinha + vendas[1, c]
fimpara
mediaLinha <- totalLinha / 3.0
// Resultado: totalLinha = 3800.00 | mediaLinha = 1266.67

2. A Diagonal Principal ($L = C$)

Em uma matriz quadrada ($N \times N$), a Diagonal Principal é formada pelas células onde o índice da linha é rigorosamente igual ao índice da coluna:

  • matriz[1, 1], matriz[2, 2], matriz[3, 3], matriz[4, 4].
  • Em matrizes de frete e distâncias, a diagonal principal representa o custo local de uma cidade para ela mesma (geralmente zero).

📖 Exemplo Guiado: Matriz de Cotação de Rotas ($4 \times 4$)

Código do Algoritmo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
algoritmo "Cotador_Rotas_4x4"
var
   tarifas : vetor [1..4, 1..4] de real
   origem, destino : inteiro
   valorCotado : real

inicio
   // 1. Carga da Matriz de Tarifas (Origem x Destino)
   // Linha 1: SP | Linha 2: RJ | Linha 3: PR | Linha 4: MG
   tarifas[1, 1] <- 0.00   ; tarifas[1, 2] <- 850.00 ; tarifas[1, 3] <- 920.00 ; tarifas[1, 4] <- 780.00
   tarifas[2, 1] <- 850.00 ; tarifas[2, 2] <- 0.00   ; tarifas[2, 3] <- 1450.00; tarifas[2, 4] <- 620.00
   tarifas[3, 1] <- 920.00 ; tarifas[3, 2] <- 1450.00; tarifas[3, 3] <- 0.00   ; tarifas[3, 4] <- 1380.00
   tarifas[4, 1] <- 780.00 ; tarifas[4, 2] <- 620.00 ; tarifas[4, 3] <- 1380.00; tarifas[4, 4] <- 0.00

   escreval("==================================================")
   escreval("     FASTLOG - COTAÇÃO INSTANTÂNEA DE ROTAS       ")
   escreval("==================================================")
   escreval(" Cidades: [1] SP | [2] RJ | [3] Curitiba | [4] BH ")
   escreval("--------------------------------------------------")
   
   escreva("Selecione a Cidade de ORIGEM (1 a 4): ")
   leia(origem)
   escreva("Selecione a Cidade de DESTINO (1 a 4): ")
   leia(destino)

   escreval("")
   se (origem >= 1) e (origem <= 4) e (destino >= 1) e (destino <= 4) entao
      valorCotado <- tarifas[origem, destino]
      
      se (origem = destino) entao
         escreval(">> [AVISO]: Origem e Destino são a mesma praça (Custo R$ 0.00).")
      senao
         escreval(">> [COTAÇÃO APROVADA]")
         escreval("   Rota Selecionada: Polo ", origem, " -> Polo ", destino)
         escreval("   Tarifa Padrão de Frete: R$ ", valorCotado:8:2)
      fimse
   senao
      escreval("[ERRO]: Código de cidade inválido! Escolha entre 1 e 4.")
   fimse
   escreval("==================================================")
fimalgoritmo

✅ Exemplo de Execução no Console (F9):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
==================================================
     FASTLOG - COTAÇÃO INSTANTÂNEA DE ROTAS       
==================================================
 Cidades: [1] SP | [2] RJ | [3] Curitiba | [4] BH 
--------------------------------------------------
Selecione a Cidade de ORIGEM (1 a 4): 1
Selecione a Cidade de DESTINO (1 a 4): 3

>> [COTAÇÃO APROVADA]
   Rota Selecionada: Polo 1 -> Polo 3
   Tarifa Padrão de Frete: R$   920.00
==================================================

🛠️ Prática Obrigatória 1: Somatório Anual de 3 Filiais (Totais por Linha)

Passo 1: O Desafio

Crie um algoritmo "Soma_Linhas_Filiais" que receba uma matriz $3 \times 4$ (3 Filiais $\times$ 4 Trimestres). O programa deve:

  1. Receber os dados da matriz.
  2. Calcular e imprimir o Faturamento Total Anual de cada uma das 3 Filiais separadamente.
  3. Calcular e imprimir também a Média Trimestral de cada Filial (Total Anual ÷ 4 trimestres).

✅ Resultado Esperado (Prática 1):

1
2
3
4
--- RESULTADO ANUAL CONSOLIDADO ---
Filial 1 (SP): Total R$ 640000.00 | Média Trimestral R$ 160000.00
Filial 2 (RJ): Total R$ 420000.00 | Média Trimestral R$ 105000.00
Filial 3 (PR): Total R$ 510000.00 | Média Trimestral R$ 127500.00

🛠️ Prática Obrigatória 2: Somatório de Vendas Globais por Mês (Totais por Coluna)

Com a mesma matriz $3 \times 4$, construa o laço invertido que calcula o Faturamento Total da Empresa em cada um dos 4 Trimestres (somando todas as filiais na vertical).

✅ Resultado Esperado (Prática 2):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
=== ENTRADA DE DADOS DAS FILIAIS (3 Filiais x 4 Trimestres) ===
Filial 1 - Trim 1: 150000.00
Filial 1 - Trim 2: 180000.00
Filial 1 - Trim 3: 150000.00
Filial 1 - Trim 4: 160000.00
Filial 2 - Trim 1: 100000.00
Filial 2 - Trim 2: 110000.00
Filial 2 - Trim 3: 100000.00
Filial 2 - Trim 4: 110000.00
Filial 3 - Trim 1: 120000.00
Filial 3 - Trim 2: 130000.00
Filial 3 - Trim 3: 125000.00
Filial 3 - Trim 4: 135000.00

--- DESEMPENHO DA REDE POR TRIMESTRE (TODAS AS FILIAIS) ---
Trimestre 1 | Faturamento Global da Rede: R$  370000.00
Trimestre 2 | Faturamento Global da Rede: R$  420000.00
Trimestre 3 | Faturamento Global da Rede: R$  375000.00
Trimestre 4 | Faturamento Global da Rede: R$  405000.00

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_16_SeuNome_SeuSobrenome.alg.
  2. Verifique se os acumuladores de linha e coluna são devidamente zerados a cada iteração externa.
  3. No Microsoft Teams, envie na tarefa “VisuAlg Cap 16 - Operações em Matrizes”.
  4. Clique em Entregar (Turn In).

💡 Checkpoint de Lógica & Engenharia de Software

Você acabou de aplicar os conceitos essenciais de Álgebra Linear Computacional e Processamento Matricial. Frameworks como NumPy (Python), TensorFlow e PyTorch utilizam operações matriciais altamente otimizadas na GPU para treinar Modelos de Linguagem (LLMs) e Redes Neurais Artificiais.


🔥 Desafio de Fixação: Soma da Diagonal Principal

Crie um algoritmo que leia uma matriz $4 \times 4$ de números inteiros e calcule a soma exclusiva dos elementos que pertencem à Diagonal Principal (l = c).


🔑 Gabarito de Código Completo

Prática 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
algoritmo "Soma_Linhas_Filiais"
var
   vendas : vetor [1..3, 1..4] de real
   l, c : inteiro
   totalFilial, mediaFilial : real
inicio
   escreval("=== ENTRADA DE DADOS DAS FILIAIS (3 Filiais x 4 Trimestres) ===")
   para l de 1 ate 3 faca
      para c de 1 ate 4 faca
         escreva("Filial ", l, " - Trimestre ", c, " (R$): ")
         leia(vendas[l, c])
      fimpara
   fimpara

   escreval("")
   escreval("--- FATURAMENTO ANUAL CONSOLIDADO POR FILIAL ---")
   para l de 1 ate 3 faca
      totalFilial <- 0.0 // Zera o acumulador para cada filial!
      para c de 1 ate 4 faca
         totalFilial <- totalFilial + vendas[l, c]
      fimpara
      mediaFilial <- totalFilial / 4.0
      escreval("Filial #", l, " -> Faturamento Anual: R$ ", totalFilial:10:2, " | Média Trimestral: R$ ", mediaFilial:10:2)
   fimpara
fimalgoritmo

Prática 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
algoritmo "Soma_Colunas_Trimestres"
var
   vendas : vetor [1..3, 1..4] de real
   l, c : inteiro
   totalTrimestre : real
inicio
   // Leitura da Matriz
   para l de 1 ate 3 faca
      para c de 1 ate 4 faca
         escreva("Filial ", l, " - Trim ", c, ": ")
         leia(vendas[l, c])
      fimpara
   fimpara

   escreval("")
   escreval("--- DESEMPENHO DA REDE POR TRIMESTRE (TODAS AS FILIAIS) ---")
   // Laço Externo na Coluna (Trimestres 1 a 4)
   para c de 1 ate 4 faca
      totalTrimestre <- 0.0 // Zera para cada trimestre!
      // Laço Interno na Linha (Filiais 1 a 3)
      para l de 1 ate 3 faca
         totalTrimestre <- totalTrimestre + vendas[l, c]
      fimpara
      escreval("Trimestre ", c, " | Faturamento Global da Rede: R$ ", totalTrimestre:10:2)
   fimpara
fimalgoritmo

Desafio:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
algoritmo "Soma_Diagonal_Principal"
var
   matriz : vetor [1..4, 1..4] de inteiro
   l, c, somaDiagonal : inteiro
inicio
   somaDiagonal <- 0

   escreval("Digite os números para a matriz 4x4:")
   para l de 1 ate 4 faca
      para c de 1 ate 4 faca
         escreva("[", l, ",", c, "]: ")
         leia(matriz[l, c])
         se (l = c) entao
            somaDiagonal <- somaDiagonal + matriz[l, c]
         fimse
      fimpara
   fimpara

   escreval("")
   escreval("Soma dos Elementos da Diagonal Principal (L=C): ", somaDiagonal)
fimalgoritmo

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que foi estudado neste capítulo. Ao concluir, leve o caderno até o professor para correção e visto.

  1. Para somar os valores de uma matriz por linha, qual índice deve ficar fixo no laço externo e qual índice o laço interno percorre, segundo os Fundamentos?
  2. Como se deve inverter a ordem dos laços para calcular o somatório por coluna, em comparação com o somatório por linha?
  3. O que é a Diagonal Principal de uma matriz quadrada, e qual condição matemática entre linha e coluna a define?
  4. Em matrizes de frete e distâncias entre cidades, o que a Diagonal Principal geralmente representa?
  5. No Cenário Prático, quais são as 4 capitais brasileiras atendidas pela FastLog e seus respectivos números de identificação (1 a 4)?
  6. No algoritmo Cotador_Rotas_4x4, o que o programa exibe quando a cidade de origem digitada é igual à cidade de destino?
  7. Na Prática Obrigatória 1 (Soma_Linhas_Filiais), qual é a dimensão da matriz de vendas utilizada (quantas filiais por quantos trimestres)?
  8. Na Prática Obrigatória 2, qual índice passa a ser fixado no laço externo, em vez do índice usado como laço externo na Prática 1?
  9. Segundo o Checkpoint de Lógica, quais frameworks citados usam operações matriciais otimizadas em GPU para treinar Modelos de Linguagem (LLMs) e Redes Neurais?
  10. No código Soma_Linhas_Filiais, por que a variável totalFilial precisa ser zerada (totalFilial <- 0.0) dentro do laço externo, antes de somar os dados de cada nova filial?