Usando indexação de matrizes, explique como é possível selecionar diversos elementos de uma matriz em linhas e colunas especificadas pelo usuário do programa.
Passo 1
O que o problema pede: explicar, usando indexação de matrizes, como permitir que um usuário do programa escolha linhas e colunas e o programa retorne os elementos correspondentes da matriz.
Informações relevantes que vou usar (pressupostas pelo enunciado):
Existe uma matriz A de tamanho m\times n.
O usuário fornece índices de linhas e colunas. Isso pode significar duas interpretações diferentes (ambas válidas e comuns):
O usuário fornece um conjunto/vetor de linhas R=(r_1,\dots,r_p) e um conjunto/vetor de colunas C=(c_1,\dots,c_q) e espera receber a submatriz com todas as combinações de (r_i,c_j).
O usuário fornece pares correspondentes de índices (i_k,j_k) para k=1,\dots,t e espera receber apenas os elementos A_{i_k,j_k} correspondentes, na mesma ordem.
Também é comum o usuário fornecer máscaras lógicas (booleanas) indicando quais linhas/colunas incluir.
A partir daqui vou explicar os métodos práticos (fáceis de aplicar em provas e em código) para cada caso, com fórmulas, exemplos e a lógica por trás.
Passo 2
Definições e notação básica (essencial para não nos perder):
A matriz é A com tamanho m\times n. Isso significa que há m linhas (índices de linha válidos 1,\dots,m) e n colunas (índices de coluna válidos 1,\dots,n).
Vetor de linhas do usuário: R=(r_1,\dots,r_p) com cada r_u\in\{1,\dots,m\}.
Vetor de colunas do usuário: C=(c_1,\dots,c_q) com cada c_v\in\{1,\dots,n\}.
Conceito chave (fórmula): se o usuário quer a submatriz com todas as combinações de R e C, então o resultado B é a matriz de tamanho p\times q com entradas
Esse cálculo é o que se faz “na prova” sem ferramenta: pegar linha por linha e coluna por coluna.]
Passo 4
Caso 2: selecionar pares correspondentes (i_k,j_k) (seleção elemento-a-elemento).
Defina duas listas (vetores) de mesmo comprimento t:
I=(i_1,\dots,i_t),\qquad J=(j_1,\dots,j_t),
cada par (i_k,j_k) indica o elemento A_{i_k,j_k}. O resultado esperado é um vetor de comprimento t:
b_k = A_{i_k,j_k},\qquad k=1,\dots,t.
Exemplo rápido: com a mesma A do passo anterior, se I=(2,3) e J=(1,4) então
b_1=A_{2,1}=5,\qquad b_2=A_{3,4}=12,
resultado b=(5,12). Observe que aqui não construímos uma submatriz com todas as combinações; pegamos apenas os pares especificados.
Passo 5
Mapeamento para índices lineares (útil quando a linguagem só aceita índices lineares ou para construir soluções rápidas). Explico a fórmula e a diferença entre ordenações:
Se a linguagem/matriz usa indexação em coluna-major (ex.: MATLAB), o índice linear L correspondente ao elemento (r,c) (com indexação base 1) é
L = r + (c-1)\,m.
Isto vem do fato de que as colunas são armazenadas uma após a outra; a primeira coluna tem índices 1,\dots,m, a segunda tem m+1,\dots,2m, etc.
Se a linguagem usa row-major (ex.: C, NumPy se olhar o arranjo ravel com ordem ‘C’), o índice linear (base 1) é
L = (r-1)\,n + c.
Exemplo concreto (coluna-major): com A do passo 3 (m=3), o elemento (r,c)=(3,2) tem
L = 3 + (2-1)\cdot 3 = 3 + 3 = 6,
ou seja, é o 6º elemento se listarmos a matriz coluna a coluna: (1,5,9,2,6,10,3,7,11,4,8,12). Saber essa fórmula permite usar funções como A(L) no MATLAB ou A.flat[L] no NumPy (ajustando para base 0 quando necessário).
Passo 6
Máscaras lógicas (booleanas) — uma forma muito legível e robusta:
Se o usuário fornece índices de linhas R como conjunto, pode-se construir um vetor booleano \text{rowMask}\in\{ \text{False},\text{True}\}^m com \text{rowMask}_i=\text{True} se i\in R. Analogamente \text{colMask}\in\{ \text{False},\text{True}\}^n.
A submatriz pedida é então B = A[\text{rowMask},\text{colMask}] (notação conceitual). Em muitas linguagens (NumPy, MATLAB) essa operação retorna diretamente a submatriz com as linhas e colunas selecionadas.
Vantagens das máscaras: simplicidade, clareza no código e fácil combinação (por exemplo, permitir ao usuário especificar intervalos contínuos).
Passo 7
Implementação prática (pseudo-código e dicas para provas/código) — sem assumir linguagem, mas dando padrões úteis:
Para retornar a submatriz com todas as combinações (caso 1): simplesmente indexar por vetores:
Matemático/conciso: B = A[R,C] onde B_{uv}=A_{r_u,c_v}.
Em pseudocódigo: pegar cada u em 1\ldots p e cada v em 1\ldots q e atribuir B[u,v]=A[R[u],C[v]].
Para pares correspondentes (caso 2): usar indexação pareada:
Matemático: b_k = A_{I_k,J_k} para k=1..t.
Em implementação, muitas linguagens aceitam indexação “fancy” com dois vetores do mesmo tamanho; caso contrário calcular índices lineares com a fórmula do passo 5 e então extrair.
Dica de prova: quando pedir “mostre como selecionar” escreva a fórmula do passo 2 (submatriz) e do passo 4 (pares) e mostre um pequeno exemplo numérico — isso costuma ser suficiente.
Passo 8
Erros comuns e cuidados (para não se enrolar na hora da prova):
Atenção à indexação base 0 vs base 1: na matemática e em MATLAB usa-se tipicamente base 1; em Python/NumPy e C usa-se base 0. Ao aplicar a fórmula linear do passo 5 ajuste os termos (r-1) ou não conforme a base.
Não confundir submatriz (produto cartesiano das listas R e C) com seleção pareada de elementos. Eles dão respostas diferentes. Sempre questione qual comportamento o usuário espera.
Verificar se índices estão dentro de 1\dots m e 1\dots n; tratar repetição de índices (às vezes se quer duplicar linhas/colunas de propósito).
Se o usuário fornecer índices não ordenados, a ordem do resultado deve seguir a ordem dada — preserve-a a menos que solicitado reorganizar.
Passo 9
Resumo prático em palavras fáceis (como um checklist que dá para usar na prova):
Se o usuário der R e C e quiser todas as combinações: use B com B_{uv}=A_{r_u,c_v}.
Se o usuário der pares (i_k,j_k): retire b_k=A_{i_k,j_k} para cada k.
Se for preciso indexar linearmente, use as fórmulas do passo 5 conforme a ordenação da linguagem.
Máscaras booleanas são convenientes e expressivas para selecionar linhas/colunas.
Resposta
Submatriz (todas as combinações): B com B_{uv}=A_{r_u,c_v} para u=1,\dots,p e v=1,\dots,q.
Seleção por pares correspondentes: dado I=(i_1,\dots,i_t) e J=(j_1,\dots,j_t), retornar b_k=A_{i_k,j_k} para k=1,\dots,t.
Índice linear (coluna-major): L = r + (c-1)\,m. Índice linear (row-major): L = (r-1)\,n + c.
Alternativa prática: usar máscaras booleanas \text{rowMask} e \text{colMask} e então B = A[\text{rowMask},\text{colMask}].