Ejercicios Con Matrices

- Mostrar la diagonal principal. ( Solo las matrices cuadradas tienen diagonales).
- Mostrar la diagonal secundaria.
- Mostrar triángulo superior según la diagonal principal – EXCLUYENDO LA DIAGONAL.
- Mostrar triángulo inferior según la diagonal principal – EXCLUYENDO LA DIAGONAL.
- Mostrar triángulo superior según la diagonal principal – INCLUYENDO LA DIAGONAL.
- Mostrar triángulo inferior según la diagonal principal – INCLUYENDO LA DIAGONAL.
- Mostrar triángulo superior según la diagonal secundaria – EXCLUYENDO LA DIAGONAL.
- Mostrar triángulo inferior según la diagonal secundaria – EXCLUYENDO LA DIAGONAL.
- Mostrar triángulo superior según la diagonal secundaria – INCLUYENDO LA DIAGONAL.
- Mostrar triángulo inferior según la diagonal secundaria – INCLUYENDO LA DIAGONAL.
- Mostrar ambos triángulos al mismo tiempo según diagonal principal.
- Mostrar ambos triángulos al mismo tiempo según diagonal secundaria.
- Mostrar cada uno de los siguientes triángulos por separado – EXCLUYENDO LAS DIAGONALES.

- Ídem que el anterior, pero INCLUYENDO LAS DIAGONALES (es decir el triángulo con sus porciones de la diagonal, no toda la diagonal).
- Trasponer la matriz según la diagonal principal.
- Trasponer la matriz según la diagonal secundaria.
- Trasponer la matriz a 90° horizontalmente.
- Trasponer la matriz a 90° verticalmente.
- Trasponer la matriz según el centro.
- ¿Es la matriz simétrica?
- ¿Es la matriz identidad?
- Producto de matrices!! MUY IMPORTANTE
- Dado un i, j > mostrar todos los vecinos de ese i, j (el máximo es hasta 8 vecinos).
- Dado un i, j > mostrar la mayor matriz que tenga a ese i, j de vértice.
- (i, j) Inferior izquierdo.
- (i, j) Inferior derecho.
- (i, j) Superior izquierdo.
- (i, j) Superior derecho.
- Dado un i, j > mostrar la mayor matriz CUADRADA que tenga a ese i, j de vértice.
- Dado un i, j > mostrar la menor matriz que tenga a ese i, j de vértice.
- Dado un i, j > mostrar la menor matriz CUADRADA que tenga a ese i, j de vértice.
- Mostrar la matriz en espiral.
Diagonal Principal:
int main() { int mat[4][4]= {{1,2,3,4},{5,6,7,8}, {9,10,11,12},{13,14,15,16}}; int sumaDP = sumDiagonalPrincipal(mat); printf("La suma de la diagonal principal es: %d \n", sumaDP); return 0; } int sumDiagonalPrincipal(int mat[][4]) { int sumaDP=0; for (int i=0; i<=3; i++) sumaDP += mat[i][i]; return sumaDP; }
Diagonal Principal para que acepte otras matrices que no sean 4 x 4
int sumDiagonalPrincipal(int cols, int mat[][cols]); int main() { int mat[4][4]= {{1,2,3,4},{5,6,7,8}, {9,10,11,12},{13,14,15,16}}; int sumaDP = sumDiagonalPrincipal(4,mat); printf("La suma de la diagonal principal es: %d \n", sumaDP); return 0; } int sumDiagonalPrincipal(int cols, int mat[][cols]) { int sumaDP=0; for (int i=0; i<cols; i++) sumaDP += mat[i][i]; return sumaDP; }
Triangulo Inferior sin diagonal principal
int sumarTriangInf(int cols, int mat[][cols]) { int sum = 0; for (int i=1 ; i< cols; i++) for(int j=0;j<i;j++) sum+= mat[i][j]; return sum; }
Triangulo Superior sin diagonal principal
int sumarTriangSup(int cols, int mat[][cols]) { int sum = 0; for (int i=0 ; i< cols-1; i++) for(int j=i+1 ;j< cols;j++) sum+= mat[i][j]; return sum; }
Diagonal Secundaria
Debo buscar alguna forma en que se relacionan i y j. La idea es realizarlo con un solo for.

int sumarDiagSec(int cols, int mat[][cols]) { int sum = 0; for (int i=0 ; i< cols; i++) sum+= mat[i][cols-1-i]; return sum; }
Suma triangulo Superior Respecto de la Diagonal Secundaria

int sumTriangSuperRespectoDiagSec(int cols, int mat[][cols]) { int suma=0; for (int i=0; i<cols; i++) for(int j=0; j<cols-1-i; j++) suma += mat[i][j]; return suma; }
Producto de Matrices
Para matrices no cuadradas, por ejemplo tengo una matriz de 2×4 y una 4×3. Las columnas de la primer matriz debe ser la misma cantidad de filas de la matriz 2.


#include <stdio.h> #include <stdlib.h> void ** crearMatriz ( size_t cantFilas, size_t cantColumnas, size_t tamElem); void destruirMatriz ( void** mat, size_t filas); void cargarMatriz (int ** mat, size_t filas, size_t columnas); void cargarMatriz2 (int ** mat, size_t filas, size_t columnas); void mostrarMatriz (int ** mat, size_t filas, size_t columnas); int ** productoMatrices(int** m1, int** m2, int filM1, int colM1filM2, int colM2); int main() { int filas = 2; int filas2 = 4; int columnas =4; int columnas2 =3; int ** matriz = (int**)crearMatriz(filas, columnas, sizeof(int)); int ** matriz2 = (int**)crearMatriz(filas2, columnas2, sizeof(int)); if(!matriz) { puts("Sin Memoria"); return 0; } if(!matriz2) { puts("Sin Memoria"); return 0; } cargarMatriz(matriz,filas,columnas); cargarMatriz2(matriz2,filas2,columnas2); mostrarMatriz(matriz,filas,columnas); printf("\n"); mostrarMatriz(matriz2,filas2,columnas2); int **matrizResult = productoMatrices(matriz,matriz2,filas,columnas,columnas2); printf("\n"); mostrarMatriz(matrizResult,filas,columnas2); destruirMatriz((void**)matriz, filas); destruirMatriz((void**)matriz2, filas2); destruirMatriz((void**)matrizResult,filas); return 0; } void ** crearMatriz ( size_t cantFilas, size_t cantColumnas, size_t tamElem) { //tamElem esta en bytes void ** mat = malloc ( cantFilas * sizeof(void*)); // reservo memoria para todas los punteros a void de filas. if(!mat) { return NULL; } void **ult = mat + cantFilas -1; for (void ** i = mat; i<=ult; i++) { *i = malloc(cantColumnas * tamElem); if(!*i) { for(void** j=mat; j<i; j++) { free(*j); } free(mat); // si hago solo free de mat libera la primer columna y el resto no. return NULL; } } return mat; } void destruirMatriz ( void** mat, size_t filas) { void** ult = mat + (filas -1); for( void ** i = mat ; i<=ult; i++) free(*i); free(mat); } void cargarMatriz (int ** mat, size_t filas, size_t columnas) { for(int i = 0; i <filas; i++) for(int j=0; j<columnas; j++) mat[i][j]=i*4+j+1; } void cargarMatriz2 (int ** mat2, size_t filas2, size_t columnas2) { for(int i = 0; i <filas2; i++) for(int j=0; j<columnas2; j++) mat2[i][j]=i*3+j+1; } void mostrarMatriz (int ** mat, size_t filas, size_t columnas) { for(int i = 0; i <filas; i++) { for(int j=0; j<columnas; j++) printf("%d \t", mat[i][j]); printf("\n"); } } int ** productoMatrices(int** m1, int** m2, int filM1, int colM1filM2, int colM2) { int** matrizResult = (int**)crearMatriz(filM1, colM2, sizeof(int)); if(!matrizResult) return NULL; for (int i= 0; i< filM1 ; i++) { for (int j= 0; j< colM2; j++) { matrizResult[i][j]=0; for (int k=0; k< colM1filM2; k++) matrizResult[i][j]+= m1[i][k]*m2[k][j]; } } return matrizResult; }
