Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Ejercicios de matrices

Universidad Nacional de Río Negro

Acerca de

Ejercicios para trabajar con arreglos bidimensionales (matrices), tanto estáticas como dinámicas.

Para profundizar en los conceptos teóricos, podés consultar el siguiente capítulo del apunte:

Operaciones Básicas

Ejercicio 21.1 - Mostrar matriz ⭐⭐⭐☆☆

Descripción

Escribir una función que reciba una matriz (un arreglo 2D), sus dimensiones (filas y columnas), y la imprima en la consola de una forma clara y ordenada, fila por fila.

Entrada
Salida
Una matriz 2x3: 
[[1, 2, 3], [4, 5, 6]]

Ejercicio 21.2 - Multiplicación por un escalar ⭐⭐☆☆☆

Descripción

Implementar una función que multiplique cada elemento de una matriz por un número escalar dado. La operación modifica la matriz original (in-place).

Entrada
Salida
Matriz: [[1, 2], [3, 4]]
Escalar: 5

Aritmética Matricial

Ejercicio 21.3 - Suma de matrices ⭐⭐⭐☆☆

Descripción

Implementar una función que sume dos matrices, A y B, y almacene el resultado en una tercera matriz, C. La suma de matrices solo es posible si ambas tienen las mismas dimensiones.

Entrada
Salida
Matriz A: [[1, 2], [3, 4]]
Matriz B: [[5, 6], [7, 8]]

Ejercicio 21.4 - Multiplicación de matrices ⭐⭐⭐☆☆

Descripción

Implementar la multiplicación de dos matrices, A (de m×nm \times n) y B (de n×pn \times p), cuyo resultado es una nueva matriz C (de m×pm \times p).

Entrada
Salida
Matriz A (2x3): [[1, 2, 3], [4, 5, 6]]
Matriz B (3x2): [[7, 8], [9, 10], [11, 12]]

Manipulación

Ejercicio 21.5 - Transposición ⭐⭐☆☆☆

Descripción

Calcular la transpuesta ATA^T de una matriz AA. La transposición se obtiene intercambiando las filas por las columnas.

Entrada
Salida
Matriz A (2x3): `[[1, 2, 3], [4, 5, 6]]`

Ejercicio 21.6 - Suma de diagonales ⭐⭐☆☆☆

Descripción

Para una matriz cuadrada, calcular la suma de los elementos de sus dos diagonales: la principal y la secundaria.

Entrada
Salida

Matriz (3x3):

[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]

Generación

Ejercicio 21.7 - Matriz identidad ⭐⭐⭐☆☆

Descripción

Generar una matriz identidad de tamaño n x n. La matriz identidad es una matriz cuadrada con unos en la diagonal principal y ceros en todas las demás posiciones.

Entrada
Salida
Tamaño n = 3

Ejercicio 21.8 - s Adicionales de Matrices ⭐⭐⭐☆☆

Ejercicio 21.9 - Matriz simétrica ⭐⭐⭐☆☆

Descripción

Escribir una función que verifique si una matriz cuadrada es simétrica. Una matriz es simétrica si es igual a su propia transpuesta, lo que significa que el elemento en la fila i, columna j es igual al elemento en la fila j, columna i.

Entrada
Salida

Matriz (3x3):

[ 1, 7, 3 ]
[ 7, 4, 5 ]
[ 3, 5, 6 ]

Ejercicio 21.10 - Suma por Filas y Columnas ⭐⭐☆☆☆

Descripción

Crear un programa que, dada una matriz, calcule dos arreglos: uno que contenga la suma de los elementos de cada fila y otro que contenga la suma de los elementos de cada columna.

Entrada
Salida

Matriz (2x3):

[ 1, 2, 3 ]
[ 4, 5, 6 ]

Ejercicio 21.11 - Elemento “Silla” ⭐⭐☆☆☆

Descripción

Encontrar un “punto de silla” en una matriz. Un punto de silla es un elemento que es simultáneamente el valor mínimo en su fila y el valor máximo en su columna.

Entrada
Salida

Matriz (3x3):

[ 1, 2, 3 ]
[ 4, 5, 6 ]
[ 7, 8, 9 ]

Ejercicio 21.12 - s de Matrices Dinámicas ⭐⭐⭐☆☆

Ejercicio 21.13 - Crear y llenar matriz dinámica ⭐⭐⭐☆☆

Descripción

Escribir una función que solicite al usuario las dimensiones (filas y columnas) y luego los elementos de una matriz, para finalmente imprimirla.

Entrada
Salida

Se le pedirá al usuario que ingrese el número de filas y columnas, y luego cada uno de los elementos.

Más Algoritmos con Matrices

Ejercicio 21.14 - Reflejar matriz ⭐⭐⭐☆☆

Implementar dos funciones: una que refleje una matriz horizontalmente (la primera fila se intercambia con la última, la segunda con la penúltima, etc.) y otra que la refleje verticalmente (la primera columna con la última, etc.).

Ejercicio 21.15 - Intercambiar filas o columnas ⭐⭐☆☆☆

Crear funciones intercambiar_filas(mat, f1, f2) e intercambiar_columnas(mat, c1, c2) que modifiquen la matriz intercambiando los elementos de las filas o columnas especificadas.

Ejercicio 21.16 - Búsqueda de submatriz ⭐⭐⭐☆☆

Escribir una función que determine si una matriz pequeña B (de k x l) se encuentra dentro de una matriz más grande A (de m x n). La función debe devolver las coordenadas de la esquina superior izquierda de la primera ocurrencia, o (-1, -1) si no se encuentra.

Ejercicio 21.17 - Determinante de matriz 3x3 ⭐⭐⭐☆☆

Calcular el determinante de una matriz 3x3 utilizando la Regla de Sarrus.

Ejercicio 21.18 - Suavizado de matriz (Filtro de caja) ⭐⭐⭐☆☆

Implementar un filtro de “suavizado” o “blur”. Para cada elemento de la matriz, su nuevo valor será el promedio de sus 8 vecinos y él mismo. Los elementos en los bordes requerirán un manejo especial.

Ejercicio 21.19 - Detección de bordes (Operador de Sobel) ⭐⭐☆☆☆

Aplicar un operador de Sobel simple para la detección de bordes. Esto implica “convolucionar” la matriz con un kernel (otra matriz pequeña, ej. 3x3) para resaltar las diferencias de intensidad, como los bordes.

Ejercicio 21.20 - Matriz de permutación ⭐⭐⭐☆☆

Verificar si una matriz cuadrada es una matriz de permutación. Esta es una matriz binaria (solo 0s y 1s) que tiene exactamente un 1 en cada fila y en cada columna.

Ejercicio 21.21 - Producto de Hadamard ⭐⭐☆☆☆

Implementar el producto de Hadamard (o producto elemento a elemento) de dos matrices A y B de las mismas dimensiones. La matriz resultante C se define como cij=aijbijc_{ij} = a_{ij} \cdot b_{ij}.

Ejercicio 21.22 - Rellenar con triángulo de Pascal ⭐⭐☆☆☆

Escribir una función que llene una matriz N x N con los valores del Triángulo de Pascal. El elemento (i, j) debe ser (ij)\binom{i}{j}.

Ejercicio 21.23 - Matriz antisimétrica ⭐⭐⭐☆☆

Verificar si una matriz cuadrada es antisimétrica. Una matriz A es antisimétrica si su transpuesta es igual a su negativa, es decir, AT=AA^T = -A. Esto implica que aij=ajia_{ij} = -a_{ji} y que todos los elementos de la diagonal principal deben ser cero.

Operaciones Avanzadas con Matrices

Ejercicio 21.24 - Norma de matriz ⭐⭐⭐☆☆

Implementar funciones que calculen diferentes normas de una matriz.

double norma_frobenius(double** matriz, int filas, int cols);
double norma_maxima(double** matriz, int filas, int cols);
double norma_uno(double** matriz, int filas, int cols);

Norma de Frobenius: AF=i,jaij2||A||_F = \sqrt{\sum_{i,j} a_{ij}^2}

Norma máxima: A=maxijaij||A||_{\infty} = \max_i \sum_j |a_{ij}| (máxima suma de fila)

Norma uno: A1=maxjiaij||A||_1 = \max_j \sum_i |a_{ij}| (máxima suma de columna)

Ejercicio 21.25 - Traza de matriz ⭐⭐⭐☆☆

Calcular la traza de una matriz cuadrada (suma de elementos de la diagonal principal).

double traza(double** matriz, int n);
tr(A)=i=1naii\text{tr}(A) = \sum_{i=1}^n a_{ii}

Ejercicio 21.26 - Rango de matriz ⭐⭐⭐☆☆

Implementar un algoritmo para calcular el rango de una matriz usando eliminación gaussiana.

int calcular_rango(double** matriz, int filas, int cols);

Estrategia: Reducir la matriz a forma escalonada y contar filas no nulas.

Ejercicio 21.27 - Matriz de cofactores ⭐⭐⭐☆☆

Calcular la matriz de cofactores para una matriz cuadrada.

double** matriz_cofactores(double** matriz, int n);

El cofactor CijC_{ij} se calcula como: Cij=(1)i+jMijC_{ij} = (-1)^{i+j} M_{ij} donde MijM_{ij} es el menor de la matriz (determinante de la submatriz obtenida eliminando fila ii y columna jj).

Ejercicio 21.28 - Matriz inversa ⭐⭐⭐☆☆

Implementar el cálculo de la inversa de una matriz usando el método de Gauss-Jordan.

double** matriz_inversa(double** matriz, int n, bool* invertible);

Algoritmo:

  1. Crear matriz aumentada [AI][A | I]

  2. Aplicar eliminación Gauss-Jordan

  3. Si se obtiene [IA1][I | A^{-1}], retornar A1A^{-1}

  4. Si no es posible, la matriz no es invertible

Ejercicio 21.29 - Potencia de matriz ⭐⭐⭐☆☆

Calcular AnA^n para una matriz cuadrada AA y un exponente entero nn.

double** potencia_matriz(double** matriz, int tam, int exponente);

Optimización: Usar exponenciación rápida para O(logn)O(\log n) multiplicaciones.

Ejercicio 21.30 - Descomposición LU ⭐⭐☆☆☆

Implementar la descomposición LU de una matriz: A=LUA = LU donde LL es triangular inferior y UU es triangular superior.

bool descomposicion_lu(double** A, int n, double** L, double** U);

Aplicación: Resolver sistemas de ecuaciones lineales eficientemente.

Ejercicio 21.31 - Valores propios (Power Method) ⭐⭐☆☆☆

Implementar el método de la potencia para calcular el valor propio dominante de una matriz.

double valor_propio_dominante(double** matriz, int n, double tolerancia);

Algoritmo:

  1. Comenzar con vector aleatorio vv

  2. Iterar: vk+1=AvkAvkv_{k+1} = \frac{Av_k}{||Av_k||}

  3. El valor propio es λ=vTAv\lambda = v^T A v

Ejercicio 21.32 - Matriz de rotación ⭐⭐⭐☆☆

Implementar funciones para crear y aplicar matrices de rotación 2D y 3D.

double** matriz_rotacion_2d(double angulo);
double** matriz_rotacion_3d_x(double angulo);
double** matriz_rotacion_3d_y(double angulo);
double** matriz_rotacion_3d_z(double angulo);

Matriz de rotación 2D:

R(θ)=(cosθsinθsinθcosθ)R(\theta) = \begin{pmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{pmatrix}

Ejercicio 21.33 - Matriz de proyección ⭐⭐⭐☆☆

Crear matriz de proyección ortogonal sobre un vector.

double** matriz_proyeccion(double* vector, int n);

Fórmula: P=vvTvTvP = \frac{vv^T}{v^Tv}

Algoritmos de Procesamiento de Imágenes

Considerar una matriz como una imagen en escala de grises donde cada elemento representa la intensidad de un píxel.

Ejercicio 21.34 - Umbralización (Thresholding) ⭐⭐☆☆☆

Convertir una imagen en escala de grises a binaria (solo 0 y 255) usando un umbral.

void umbralizar(int** imagen, int filas, int cols, int umbral);

Algoritmo: Si pixel >= umbral, asignar 255, sino asignar 0.

Ejercicio 21.35 - Histograma de Imagen ⭐⭐☆☆☆

Calcular el histograma de una imagen (frecuencia de cada nivel de intensidad).

void calcular_histograma(int** imagen, int filas, int cols, int* histograma);

El histograma tiene 256 posiciones (0-255) que cuentan la frecuencia de cada intensidad.

Ejercicio 21.36 - Ecualización de Histograma ⭐⭐☆☆☆

Mejorar el contraste de una imagen mediante ecualización de histograma.

void ecualizar_histograma(int** imagen, int filas, int cols);

Algoritmo:

  1. Calcular histograma

  2. Calcular función de distribución acumulativa (CDF)

  3. Normalizar CDF y aplicar transformación a cada píxel

Ejercicio 21.37 - Filtro gaussiano ⭐⭐☆☆☆

Implementar un filtro gaussiano para suavizado de imagen.

void filtro_gaussiano(double** imagen, int filas, int cols, double sigma);

Kernel gaussiano 3x3:

K=116(121242121)K = \frac{1}{16}\begin{pmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \end{pmatrix}

Ejercicio 21.38 - Detección de bordes (Laplaciano) ⭐⭐☆☆☆

Aplicar el operador Laplaciano para detectar bordes.

void detectar_bordes_laplaciano(int** imagen, int filas, int cols, int** resultado);

Kernel Laplaciano:

K=(010141010)K = \begin{pmatrix} 0 & 1 & 0 \\ 1 & -4 & 1 \\ 0 & 1 & 0 \end{pmatrix}

Matrices Especiales

Ejercicio 21.39 - Matriz de Vandermonde ⭐⭐⭐☆☆

Generar una matriz de Vandermonde a partir de un vector.

double** matriz_vandermonde(double* x, int n, int m);

Definición: Vij=xij1V_{ij} = x_i^{j-1}

Ejemplo con x=[1,2,3]x = [1, 2, 3] y m=4m = 4:

V=(1111124813927)V = \begin{pmatrix} 1 & 1 & 1 & 1 \\ 1 & 2 & 4 & 8 \\ 1 & 3 & 9 & 27 \end{pmatrix}

Ejercicio 21.40 - Matriz de Hilbert ⭐⭐⭐☆☆

Generar una matriz de Hilbert de orden nn.

double** matriz_hilbert(int n);

Definición: Hij=1i+j1H_{ij} = \frac{1}{i+j-1}

Nota: Las matrices de Hilbert son notoriamente mal condicionadas para inversión.

Ejercicio 21.41 - Matriz de Toeplitz ⭐⭐⭐☆☆

Verificar si una matriz es de Toeplitz (cada diagonal descendente de izquierda a derecha tiene valores constantes).

bool es_toeplitz(int** matriz, int filas, int cols);

Propiedad: ai,j=ai+1,j+1a_{i,j} = a_{i+1,j+1}

Ejercicio 21.42 - Matriz circulante ⭐⭐⭐☆☆

Generar una matriz circulante a partir de su primera fila.

int** matriz_circulante(int* primera_fila, int n);

Ejemplo con primera fila [1,2,3,4][1, 2, 3, 4]:

C=(1234412334122341)C = \begin{pmatrix} 1 & 2 & 3 & 4 \\ 4 & 1 & 2 & 3 \\ 3 & 4 & 1 & 2 \\ 2 & 3 & 4 & 1 \end{pmatrix}

Ejercicio 21.43 - Matriz de Hankel ⭐⭐⭐☆☆

Generar una matriz de Hankel (opuesta a Toeplitz: diagonales de arriba-derecha a abajo-izquierda son constantes).

double** matriz_hankel(double* c, double* r, int n);

Resolución de Sistemas de Ecuaciones

Ejercicio 21.44 - Sustitución hacia adelante ⭐⭐☆☆☆

Resolver un sistema triangular inferior Lx=bLx = b.

double* sustitucion_adelante(double** L, double* b, int n);

Algoritmo: Resolver de arriba hacia abajo.

Ejercicio 21.45 - Sustitución hacia atrás ⭐⭐☆☆☆

Resolver un sistema triangular superior Ux=bUx = b.

double* sustitucion_atras(double** U, double* b, int n);

Algoritmo: Resolver de abajo hacia arriba.

Ejercicio 21.46 - Eliminación gaussiana completa ⭐⭐☆☆☆

Implementar eliminación gaussiana con pivoteo completo para resolver Ax=bAx = b.

double* resolver_sistema(double** A, double* b, int n);

Ejercicio 21.47 - Método de Jacobi ⭐⭐☆☆☆

Resolver Ax=bAx = b iterativamente usando el método de Jacobi.

double* metodo_jacobi(double** A, double* b, int n, double tolerancia, int max_iter);

Fórmula de iteración:

xi(k+1)=1aii(bijiaijxj(k))x_i^{(k+1)} = \frac{1}{a_{ii}}\left(b_i - \sum_{j \neq i} a_{ij}x_j^{(k)}\right)

Ejercicio 21.48 - Método de Gauss-Seidel ⭐⭐☆☆☆

Similar a Jacobi pero usa valores actualizados inmediatamente.

double* metodo_gauss_seidel(double** A, double* b, int n, double tolerancia, int max_iter);

Converge más rápido que Jacobi para matrices con diagonal dominante.

Operaciones Matriciales con Bloques

Ejercicio 21.49 - Multiplicación por bloques ⭐⭐☆☆☆

Implementar multiplicación de matrices usando el algoritmo por bloques (más eficiente para matrices grandes por mejor uso de caché).

double** multiplicar_bloques(double** A, double** B, int n, int tam_bloque);

Ejercicio 21.50 - Transpuesta por bloques ⭐⭐☆☆☆

Implementar transpuesta usando bloques para mejor localidad de caché.

void transponer_bloques(double** matriz, int n, int tam_bloque);

Ejercicio 21.51 - Strassen para matrices grandes ⭐⭐⭐☆☆

Implementar el algoritmo de Strassen para multiplicación rápida de matrices grandes.

double** strassen(double** A, double** B, int n);

Complejidad: O(n2.807)O(n^{2.807}) vs O(n3)O(n^3) del método tradicional.

Ejercicio 21.52 - Inicializar y Mostrar Matriz ⭐☆☆☆☆

Creá una matriz 3×3, inicializala con valores del 1 al 9, y mostrala.

Orientación:


Ejercicio 21.53 - Suma de Elementos ⭐☆☆☆☆

Calculá la suma de todos los elementos de una matriz.

Orientación:


Ejercicio 21.54 - Máximo y Mínimo ⭐⭐☆☆☆

Encontrá el elemento mayor y menor de una matriz, junto con sus posiciones.

Orientación:


Ejercicio 21.55 - Matriz Identidad ⭐⭐☆☆☆

Generá una matriz identidad de tamaño N×N (1s en diagonal, 0s en el resto).

Orientación:


Ejercicio 21.56 - Transpuesta ⭐⭐⭐☆☆

Calculá la transpuesta de una matriz (intercambiar filas por columnas).

Orientación:


Ejercicio 21.57 - Diagonal Principal ⭐⭐☆☆☆

Mostrá y sumá los elementos de la diagonal principal de una matriz cuadrada.

Orientación:


Ejercicio 21.58 - Diagonal Secundaria ⭐⭐☆☆☆

Mostrá y sumá los elementos de la diagonal secundaria.

Orientación:


Ejercicio 21.59 - Matriz Simétrica ⭐⭐⭐☆☆

Verificá si una matriz es simétrica (igual a su transpuesta).

Orientación:


Ejercicio 21.60 - Suma de Matrices ⭐⭐⭐☆☆

Sumá dos matrices del mismo tamaño.

Orientación:


Ejercicio 21.61 - Multiplicación por Escalar ⭐⭐⭐☆☆

Multiplicá todos los elementos de una matriz por un escalar.

Orientación:


Ejercicio 21.62 - Buscar Elemento ⭐⭐⭐☆☆

Buscá un valor en la matriz. Si lo encontrás, mostrá su posición (fila, columna).

Orientación:


Ejercicio 21.63 - Suma por Filas y Columnas ⭐⭐⭐☆☆

Calculá la suma de cada fila y la suma de cada columna.

Orientación:


Ejercicio 21.64 - Borde de la Matriz ⭐⭐⭐☆☆

Mostrá solo los elementos del borde de una matriz.

Orientación:


Ejercicio 21.65 - Rotar Matriz 90 Grados ⭐⭐⭐⭐☆

Rotá una matriz cuadrada 90° en sentido horario.

Orientación:


Ejercicio 21.66 - Multiplicación de Matrices ⭐⭐⭐⭐⭐

Multiplicá dos matrices (A de M×N y B de N×P, resultado M×P).

Algoritmo:

C[i][j] = suma de A[i][k] * B[k][j] para k = 0..N-1

Orientación:


Ejercicio 21.67 - Matriz en Espiral ⭐⭐⭐⭐⭐

Llenó una matriz en forma de espiral (desde afuera hacia adentro).

Ejemplo 4×4:

 1  2  3  4
12 13 14  5
11 16 15  6
10  9  8  7

Orientación:


Ejercicio 21.68 - Sudoku - Validador de Fila ⭐⭐⭐⭐☆

Verificá si una fila de un Sudoku es válida (números 1-9 sin repetir).

Orientación:


Ejercicio 21.69 - Matriz Traspuesta In-Place ⭐⭐⭐⭐☆

Transponé una matriz cuadrada sin usar matriz auxiliar completa.

Orientación:


Ejercicio 21.70 - Matriz de Distancias ⭐⭐⭐⭐⭐

Dadas N ciudades con coordenadas (x, y), calculá matriz de distancias entre todas.

Orientación:


Ejercicio 21.71 - Juego de la Vida (Conway) ⭐⭐⭐⭐⭐

Implementá una generación del Juego de la Vida de Conway.

Reglas:

  1. Celda viva con 2-3 vecinos vivos: sobrevive

  2. Celda muerta con exactamente 3 vecinos vivos: nace

  3. Otras: muere o permanece muerta

Orientación:


Ejercicio 21.72 - s Adicionales ⭐⭐☆☆☆

Ejercicio 21.73 - Matriz Pascal (Triángulo de Pascal) ⭐⭐⭐⭐☆

Generá el triángulo de Pascal como matriz.

Orientación:


Ejercicio 21.74 - Matriz Antisimétrica ⭐⭐⭐⭐☆

Verificá si una matriz es antisimétrica (A[i][j] = -A[j][i]).

Orientación:


Ejercicio 21.75 - Submatriz Mayor Suma ⭐⭐⭐⭐⭐

Encontrá la submatriz 2×2 con mayor suma dentro de una matriz más grande.

Orientación:


Ejercicio 21.76 - Matriz Dispersa (Sparse) ⭐⭐⭐⭐⭐

Representá una matriz dispersa (muchos ceros) eficientemente.

Orientación:


Notas Finales

Estas consignas cubren arrays bidimensionales desde operaciones básicas hasta algoritmos complejos, preparando para trabajar con matrices dinámicas en apuntes posteriores.