public static object MatrizPorColumnas(Matriz Matriz, params int[] Columnas) { Matriz Retorno = new Matriz(Matriz.Filas, Columnas.GetUpperBound(0) + 1); for (int i = 0; i <= Columnas.GetUpperBound(0); i++) { for (int j = 0; j <= Matriz.Filas - 1; j++) { Retorno.EstablecerValor(j, i, Matriz.ObtenerValor(j, Columnas[i])); } } return Retorno; }
public static object MatrizPorFilas(Matriz Matriz, params int[] Filas) { Matriz Retorno = new Matriz(Filas.GetUpperBound(0) + 1, Matriz.Columnas); for (int i = 0; i <= Filas.GetUpperBound(0); i++) { for (int j = 0; j <= Matriz.Columnas - 1; j++) { Retorno.EstablecerValor(i, j, Matriz.ObtenerValor(Filas[i], j)); } } return Retorno; }
public static object SubMatrizCuadrada(Matriz Matriz, int Fila, int Columna, int Dimensiones) { object functionReturnValue = null; if (!((Fila + Dimensiones <= Matriz.Filas) && (Columna + Dimensiones <= Matriz.Columnas))) { throw new ExcepcionMatriz("MATRIZ (SUBMATRIZ CUADRADA): No se puede obtener una submatriz de las dimensiones especificadas desde el elemento especificado."); return functionReturnValue; } Matriz Retorno = new Matriz(Dimensiones, Dimensiones); for (int i = 0; i <= Retorno.Filas - 1; i++) { for (int j = 0; j <= Retorno.Columnas - 1; j++) { Retorno.EstablecerValor(i, j, Matriz.ObtenerValor(i + Fila, j + Columna)); } } return Retorno; return functionReturnValue; }
public static double CalculoDeterminante(Matriz Matriz) { if (Matriz.Filas == Matriz.Columnas) { double Positivos = 0; double Negativos = 0; switch (Matriz.Filas) { case 1: return Matriz.ObtenerValor(0, 0); case 2: Positivos = Matriz.ObtenerValor(0, 0) * Matriz.ObtenerValor(1, 1); Negativos = Matriz.ObtenerValor(0, 1) * Matriz.ObtenerValor(1, 0); return Positivos - Negativos; case 3: Positivos = (Matriz.ObtenerValor(0, 0) * Matriz.ObtenerValor(1, 1) * Matriz.ObtenerValor(2, 2)) + (Matriz.ObtenerValor(0, 1) * Matriz.ObtenerValor(1, 2) * Matriz.ObtenerValor(2, 0)) + (Matriz.ObtenerValor(1, 0) * Matriz.ObtenerValor(2, 1) * Matriz.ObtenerValor(0, 2)); Negativos = (Matriz.ObtenerValor(0, 2) * Matriz.ObtenerValor(1, 1) * Matriz.ObtenerValor(2, 0)) + (Matriz.ObtenerValor(0, 1) * Matriz.ObtenerValor(1, 0) * Matriz.ObtenerValor(2, 2)) + (Matriz.ObtenerValor(1, 2) * Matriz.ObtenerValor(2, 1) * Matriz.ObtenerValor(0, 0)); return Positivos - Negativos; default: double Retorno = 0; for (int i = 0; i <= Matriz.Filas - 1; i++) { Retorno += (Adjunto(Matriz, i, 0) * Matriz.ObtenerValor(i, 0)); } return Retorno; } } else { throw new ExcepcionMatrizNoCuadrada("MATRIZ (DETERMINANTE): Solo se puede obtener el determinante de matrices cuadradas." + Constants.vbNewLine + "Dimensiones de la matriz: " + Matriz.Filas + "x" + Matriz.Columnas); } }
public static Matriz SubMatrizPorTamaño(Matriz Matriz, int Filas, int Columnas) { Matriz Retorno = null; if (Filas <= Matriz.Filas && Columnas <= Matriz.Columnas && Filas > 0 && Columnas > 0) { Retorno = new Matriz(Filas, Columnas); for (int i = 0; i <= Filas - 1; i++) { for (int j = 0; j <= Columnas - 1; j++) { Retorno.EstablecerValor(i, j, Matriz.ObtenerValor(i, j)); } } return Retorno; } else { throw new ExcepcionSubMatriz("MATRIZ (SUBMATRIZ): El número de filas y/o columnas es menor que uno o superior a los originales." + Constants.vbNewLine + "Dimensiones originales: " + Matriz.Filas.ToString() + "x" + Matriz.Columnas.ToString() + Constants.vbNewLine + "Dimensiones especificadas: " + Filas.ToString() + "x" + Columnas.ToString()); } }
public static Matriz SubMatrizPorColumna(Matriz Matriz, int Columna) { if (Matriz.Columnas >= 2) { Matriz Retorno = new Matriz(Matriz.Filas, Matriz.Columnas - 1); int y = 0; for (int j = 0; j <= Matriz.Columnas - 1; j++) { switch (j) { case // ERROR: Case labels with binary operators are unsupported : LessThan Columna: y = j; break; case // ERROR: Case labels with binary operators are unsupported : Equality Columna: continue; case // ERROR: Case labels with binary operators are unsupported : GreaterThan Columna: y = j - 1; break; } for (int i = 0; i <= Matriz.Filas - 1; i++) { Retorno.EstablecerValor(i, y, Matriz.ObtenerValor(i, j)); } } return Retorno; } else { throw new ExcepcionSubMatriz("MATRIZ (SUBMATRIZ): No se puede obtener una submatriz de una matriz columna, una matriz fila, o una matriz de un solo elemento." + Constants.vbNewLine + "Dimensiones de la matriz: " + Matriz.Filas + "x" + Matriz.Columnas); } }
public static Matriz Transpuesta(Matriz Matriz) { var Retorno = new Matriz(Matriz.Columnas, Matriz.Filas); for (int i = 0; i <= Matriz.Filas - 1; i++) { for (int j = 0; j <= Matriz.Columnas - 1; j++) { Retorno.EstablecerValor(j, i, Matriz.ObtenerValor(i, j)); } } return Retorno; }
public static Matriz Producto(Matriz Matriz, double Factor) { for (int i = 0; i <= Matriz.Filas - 1; i++) { for (int j = 0; j <= Matriz.Columnas - 1; j++) { Matriz.EstablecerValor(i, j, Matriz.ObtenerValor(i, j) * Factor); } } return Matriz; }
public static Matriz Producto(Matriz M1, Matriz M2) { if ((M1.Columnas == M2.Filas)) { double ValorElemento = 0; Matriz Retorno = new Matriz(M1.Filas, M2.Columnas); for (int i = 0; i <= M1.Filas - 1; i++) { for (int j = 0; j <= M2.Columnas - 1; j++) { ValorElemento = 0; for (int k = 0; k <= M1.Columnas - 1; k++) { ValorElemento += M1.ObtenerValor(i, k) * M2.ObtenerValor(k, j); } Retorno.EstablecerValor(i, j, ValorElemento); } } return Retorno; } else { throw new ExcepcionOperacionMatricial("MATRIZ (PRODUCTO): El número de columnas del primer factor debe ser igual al número de filas del segundo" + Constants.vbNewLine + "Primer factor: " + M1.Filas + "x" + M1.Columnas + Constants.vbNewLine + "Segundo factor: " + M2.Filas + "x" + M2.Columnas); } }
public static Matriz Resta(Matriz M1, Matriz M2) { Matriz Retorno = null; if ((M1.Filas == M2.Filas && M1.Columnas == M2.Columnas)) { Retorno = new Matriz(M1.Filas, M1.Columnas); for (int i = 0; i <= M1.Filas - 1; i++) { for (int j = 0; j <= M1.Columnas - 1; j++) { Retorno.EstablecerValor(i, j, M1.ObtenerValor(i, j) - M2.ObtenerValor(i, j)); } } return Retorno; } else { throw new ExcepcionOperacionMatricial("MATRIZ (RESTA): Minuendo y sustraendo deben tener las mismas dimensiones" + Constants.vbNewLine + "Minuendo: " + M1.Filas + "x" + M1.Columnas + Constants.vbNewLine + "Sustraendo: " + M2.Filas + "x" + M2.Columnas); } }
public static Matriz Suma(Matriz M1, Matriz M2) { Matriz Retorno = null; if ((M1.Filas == M2.Filas && M1.Columnas == M2.Columnas)) { Retorno = new Matriz(M1.Filas, M1.Columnas); for (int i = 0; i <= M1.Filas - 1; i++) { for (int j = 0; j <= M1.Columnas - 1; j++) { Retorno.EstablecerValor(i, j, M1.ObtenerValor(i, j) + M2.ObtenerValor(i, j)); } } return Retorno; } else { throw new ExcepcionOperacionMatricial("MATRIZ (SUMA): Los sumandos deben tener las mismas dimensiones" + Constants.vbNewLine + "Primar sumando: " + M1.Filas + "x" + M1.Columnas + Constants.vbNewLine + "Segundo sumando: " + M2.Filas + "x" + M2.Columnas); } }