Operações Comuns com Matrizes
Parte da seção Lógica & Fluxo do Journey de C# da Coddy. Lição 6 de 66.
Matrizes são comumente usadas em matemática e ciência da computação. Vamos explorar algumas operações comuns em arrays 2D.
Some duas matrizes:
int[][] AddMatrices(int[][] a, int[][] b)
{
int rows = a.Length;
int[][] result = new int[rows][];
for (int i = 0; i < rows; i++)
{
result[i] = new int[a[i].Length];
for (int j = 0; j < a[i].Length; j++)
{
result[i][j] = a[i][j] + b[i][j];
}
}
return result;
}Transpor uma matriz (trocar linhas e colunas):
int[][] Transpose(int[][] matrix)
{
int rows = matrix.Length;
int cols = matrix[0].Length;
int[][] result = new int[cols][];
for (int i = 0; i < cols; i++)
{
result[i] = new int[rows];
for (int j = 0; j < rows; j++)
{
result[i][j] = matrix[j][i];
}
}
return result;
}Calcule a soma de cada linha:
int[] RowSums(int[][] matrix)
{
int rows = matrix.Length;
int[] sums = new int[rows];
for (int i = 0; i < rows; i++)
{
int sum = 0;
for (int j = 0; j < matrix[i].Length; j++)
{
sum += matrix[i][j];
}
sums[i] = sum;
}
return sums;
}Multiplique duas matrizes:
Na multiplicação de matrizes, cada elemento result[i][j] é calculado obtendo a linha i da primeira matriz e a coluna j da segunda matriz, multiplicando seus elementos correspondentes e somando os produtos. Formalmente: result[i][j] = sum of matrix1[i][k] * matrix2[k][j] para todos os valores válidos de k.
Para que isso funcione, o número de colunas em matrix1 deve ser igual ao número de linhas em matrix2. A matriz resultante tem as dimensões [matrix1.rows × matrix2.cols].
int[][] MultiplyMatrices(int[][] a, int[][] b)
{
int rows = a.Length;
int cols = b[0].Length;
int inner = b.Length;
int[][] result = new int[rows][];
for (int i = 0; i < rows; i++)
{
result[i] = new int[cols];
for (int j = 0; j < cols; j++)
{
int sum = 0;
for (int k = 0; k < inner; k++)
{
sum += a[i][k] * b[k][j];
}
result[i][j] = sum;
}
}
return result;
}Desafio
DifícilCrie um método chamado multiplyMatrices que:
- Receba duas matrizes (arrays irregulares bidimensionais) como parâmetros: matrix1 e matrix2
- Multiplique-as seguindo as regras da multiplicação de matrizes
- Retorne a matriz resultante
Para que a multiplicação de matrizes seja válida:
- O número de colunas em matrix1 deve ser igual ao número de linhas em matrix2
- O resultado terá as dimensões: [matrix1.rows × matrix2.columns]
Como funciona a multiplicação de matrizes:
Cada elemento na posição [i][j] no resultado é calculado pegando a linha i de matrix1 e a coluna j de matrix2, multiplicando seus elementos correspondentes e somando todos esses produtos:result[i][j] = matrix1[i][0] * matrix2[0][j] + matrix1[i][1] * matrix2[1][j] + ...
Em outras palavras: result[i][j] = sum of (matrix1[i][k] * matrix2[k][j]) para cada k.
Por exemplo, se matrix1 for:
[1, 2]
[3, 4]E matrix2 for:
[5, 6]
[7, 8]Então result[0][0] = 1*5 + 2*7 = 19, result[0][1] = 1*6 + 2*8 = 22 e assim por diante. O resultado deve ser:
[19, 22]
[43, 50]Se as matrizes não puderem ser multiplicadas, retorne null.
Experimente você mesmo
public class MultiplyMatrices
{
// Implemente o método MultiplyMatrices
public static int[][] multiplyMatrices(int[][] matrix1, int[][] matrix2)
{
// Escreva seu código aqui
}
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Matrizes Multidimensionais
Noções Básicas de Matrizes 2DDeclaração e Inicialização de Matrizes 2DAcesso aos Elementos de Matrizes 2DLoops Aninhados com Matrizes 2DMatrizes IrregularesOperações Comuns com MatrizesRevisão - Multidimensional4Técnicas de Controle de Fluxo
Retornos AntecipadosCláusulas de GuardaInstruções de Salto (goto)Break e ContinueSimplificando Condicionais Aninhadas7Operadores Lógicos Avançados
Avaliação de Curto-CircuitoOperadores Lógicos CondicionaisPrecedência de OperadoresRevisão - Operadores Avançados2Tomada de Decisões Avançada
Múltiplas CondiçõesLógica Booleana ComplexaComparação entre If e SwitchInstruções Switch AninhadasRevisão - Decisões Avançadas5Tratamento de Exceções
Noções básicas de Try-CatchTipos de ExceçãoMúltiplos blocos CatchTrabalhando com ArquivosBloco FinallyUsando Using vs. Try-FinallyExceções PersonalizadasRecapitulação - Tratamento de Erros3Aprimoramentos de Loops
Desempenho de LoopsIteração de Estruturas ComplexasCada Tipo de LoopRefatoração de LoopsRevisão - Loops Otimizados6Tratamento de Nulos
Fundamentos de Referências NulasTipos de Valor AnuláveisPadrões de Verificação de NulosProgramação DefensivaRecapitulação — Segurança contra NulosPratique por conta própria: Compilador de C# online