8. Matriz diagonal, triangular y simétrica

Las matrices diagonales, triangulares y simétricas concentran información en posiciones específicas. Su estructura permite simplificar operaciones, resolver sistemas con menos cálculos y utilizar representaciones más eficientes.

8.1 Introducción

Una matriz general puede contener valores distintos de cero en cualquier posición. Sin embargo, muchas matrices que aparecen en programación poseen patrones: ceros fuera de la diagonal, ceros a un lado de ella o valores reflejados respecto de la diagonal principal.

Reconocer estos patrones permite evitar operaciones innecesarias. También ayuda a elegir algoritmos y estructuras de almacenamiento especializados.

Matriz diagonal: ceros fuera de la diagonal.
Matriz triangular: ceros debajo o encima de la diagonal.
Matriz simétrica: valores reflejados respecto de la diagonal.

8.2 ¿Qué es una matriz diagonal?

Una matriz diagonal es cuadrada y todos los elementos situados fuera de la diagonal principal son cero. Los valores de la diagonal pueden ser distintos entre sí y también pueden incluir ceros.

D = [ 5   0   0 ]
    [ 0   2   0 ]
    [ 0   0   8 ]

En notación de índices, una matriz diagonal cumple dij = 0 cuando i ≠ j.

8.3 Reconocer una matriz diagonal

Primero comprobamos que la matriz sea cuadrada. Después verificamos que toda posición ajena a la diagonal contenga cero.

function esDiagonal(matriz) {
  const n = matriz.length;
  if (!n || !matriz.every(fila => fila.length === n)) return false;

  return matriz.every((fila, i) =>
    fila.every((valor, j) => i === j || valor === 0)
  );
}

console.log(esDiagonal([[5, 0, 0], [0, 2, 0], [0, 0, 8]]));
console.log(esDiagonal([[5, 1, 0], [0, 2, 0], [0, 0, 8]]));

8.4 Construir una matriz diagonal

Una matriz diagonal queda completamente determinada por los valores de su diagonal. Podemos recibir esos valores en un vector y colocar ceros en las demás posiciones.

function crearDiagonal(diagonal) {
  return diagonal.map((valor, i) =>
    diagonal.map((_, j) => i === j ? valor : 0)
  );
}

const D = crearDiagonal([5, 2, 8]);

console.log(D);

La matriz identidad es un caso particular en el que todos los valores recibidos son iguales a uno.

8.5 Operaciones con matrices diagonales

Muchas operaciones se reducen a trabajar con los elementos de la diagonal.

  • La suma de matrices diagonales del mismo orden se obtiene sumando sus diagonales.
  • El producto de matrices diagonales del mismo orden se obtiene multiplicando sus diagonales.
  • El determinante es el producto de los elementos diagonales.
  • La inversa, cuando todos los elementos diagonales son distintos de cero, contiene sus recíprocos.
D = diag(2, 4, 5)
D-1 = diag(1/2, 1/4, 1/5)

8.6 Multiplicar una diagonal por un vector

Al multiplicar una matriz diagonal por un vector, cada componente se multiplica solamente por el valor diagonal correspondiente.

diag(d1, d2, ..., dn) · v
= [d1v1, d2v2, ..., dnvn]T
function diagonalPorVector(diagonal, vector) {
  if (diagonal.length !== vector.length) {
    throw new Error("Las dimensiones deben coincidir");
  }

  return diagonal.map((valor, i) => valor * vector[i]);
}

console.log(diagonalPorVector([2, 3, 4], [5, 6, 7]));

En lugar de realizar n² productos, la representación diagonal necesita solamente n productos.

8.7 Matriz triangular superior

Una matriz triangular superior es cuadrada y todos los elementos debajo de la diagonal principal son cero.

U = [ 2   5   7 ]
    [ 0   3   4 ]
    [ 0   0   6 ]

Se cumple uij = 0 cuando i > j. Los elementos de la diagonal y los situados encima de ella pueden tomar cualquier valor.

8.8 Matriz triangular inferior

Una matriz triangular inferior es cuadrada y todos los elementos encima de la diagonal principal son cero.

L = [ 2   0   0 ]
    [ 5   3   0 ]
    [ 7   4   6 ]

Se cumple lij = 0 cuando i < j.

8.9 Identificar matrices triangulares

Una matriz diagonal es al mismo tiempo triangular superior e inferior. Por eso una función puede devolver más de una propiedad.

function analizarTriangular(matriz) {
  const n = matriz.length;
  if (!n || !matriz.every(fila => fila.length === n)) {
    return { superior: false, inferior: false };
  }

  let superior = true;
  let inferior = true;

  for (let i = 0; i < n; i++) {
    for (let j = 0; j < n; j++) {
      if (i > j && matriz[i][j] !== 0) superior = false;
      if (i < j && matriz[i][j] !== 0) inferior = false;
    }
  }

  return { superior, inferior };
}

console.log(analizarTriangular([[2, 5, 7], [0, 3, 4], [0, 0, 6]]));

8.10 Determinante de una matriz triangular

El determinante de una matriz triangular es el producto de los elementos de su diagonal principal. Esta propiedad evita aplicar métodos más costosos.

det(U) = u11u22...unn

Para diag(U) = [2, 3, 6]:
det(U) = 2 · 3 · 6 = 36
function determinanteTriangular(matriz) {
  return matriz.reduce(
    (producto, fila, i) => producto * fila[i],
    1
  );
}

const U = [[2, 5, 7], [0, 3, 4], [0, 0, 6]];

console.log(determinanteTriangular(U));

Antes de utilizar esta función debe comprobarse que la matriz sea triangular.

8.11 Resolver un sistema triangular

Un sistema con matriz triangular superior puede resolverse desde la última ecuación hacia la primera mediante sustitución hacia atrás.

function sustitucionHaciaAtras(U, b) {
  const n = U.length;
  const x = Array(n).fill(0);

  for (let i = n - 1; i >= 0; i--) {
    let suma = 0;
    for (let j = i + 1; j < n; j++) {
      suma += U[i][j] * x[j];
    }
    x[i] = (b[i] - suma) / U[i][i];
  }

  return x;
}

const U = [[2, 1, -1], [0, 3, 2], [0, 0, 4]];
const b = [5, 10, 8];

console.log(sustitucionHaciaAtras(U, b));

Para una matriz triangular inferior se utiliza sustitución hacia adelante, comenzando por la primera ecuación.

8.12 ¿Qué es una matriz simétrica?

Una matriz simétrica es cuadrada y coincide con su transpuesta.

A = AT

A = [ 2   5   1 ]
    [ 5   3   7 ]
    [ 1   7   4 ]

Los valores reflejados respecto de la diagonal principal son iguales: aij = aji.

8.13 Transpuesta y simetría

Transponer una matriz intercambia sus filas por sus columnas. En una matriz simétrica, ese intercambio no modifica los valores.

function transponer(matriz) {
  return matriz[0].map((_, j) =>
    matriz.map(fila => fila[j])
  );
}

const A = [[2, 5, 1], [5, 3, 7], [1, 7, 4]];

console.log(transponer(A));

La salida contiene las mismas filas que la matriz original.

8.14 Reconocer una matriz simétrica

Después de comprobar que la matriz sea cuadrada, comparamos cada elemento aij con su reflejo aji.

function esSimetrica(matriz) {
  const n = matriz.length;
  if (!n || !matriz.every(fila => fila.length === n)) return false;

  for (let i = 0; i < n; i++) {
    for (let j = i + 1; j < n; j++) {
      if (matriz[i][j] !== matriz[j][i]) return false;
    }
  }

  return true;
}

console.log(esSimetrica([[2, 5, 1], [5, 3, 7], [1, 7, 4]]));

Solo necesitamos revisar un lado de la diagonal, porque el otro contiene las posiciones reflejadas.

8.15 Construir una matriz simétrica

Podemos completar la mitad inferior copiando los valores reflejados de la mitad superior.

function completarSimetrica(parteSuperior) {
  const n = parteSuperior.length;

  return Array.from({ length: n }, (_, i) =>
    Array.from({ length: n }, (_, j) =>
      i <= j ? parteSuperior[i][j] : parteSuperior[j][i]
    )
  );
}

const superior = [[2, 5, 1], [0, 3, 7], [0, 0, 4]];

console.log(completarSimetrica(superior));

8.16 Aplicaciones de las matrices simétricas

Las matrices simétricas aparecen cuando una relación entre i y j es igual a la relación entre j e i.

  • Matrices de distancias: la distancia de A a B coincide con la de B a A.
  • Grafos no dirigidos: si el nodo i está conectado con j, también j está conectado con i.
  • Matrices de covarianza: la covarianza entre dos variables es simétrica.
  • Formas cuadráticas: se utilizan para representar energía, error y curvatura.
En una matriz simétrica solo es necesario almacenar la diagonal y uno de sus lados; el otro puede reconstruirse por reflexión.

8.17 Relaciones y almacenamiento eficiente

Tipo Valores necesarios Propiedades adicionales
Diagonal n × n n Triangular superior, inferior y simétrica
Triangular n × n n(n + 1) / 2 Determinante igual al producto diagonal
Simétrica n × n n(n + 1) / 2 Coincide con su transpuesta
General n × n Sin patrón obligatorio

Una matriz diagonal puede guardarse solamente como el vector de su diagonal.

const diagonalCompacta = [5, 2, 8, 4];

function obtenerElementoDiagonal(diagonal, i, j) {
  return i === j ? diagonal[i] : 0;
}

console.log(obtenerElementoDiagonal(diagonalCompacta, 2, 2));
console.log(obtenerElementoDiagonal(diagonalCompacta, 1, 3));

8.18 Errores frecuentes

  • Exigir que los elementos de la diagonal de una matriz diagonal sean distintos de cero.
  • Olvidar comprobar que la matriz sea cuadrada.
  • Confundir triangular superior con triangular inferior.
  • Creer que los elementos del lado no nulo de una matriz triangular deben ser todos distintos de cero.
  • Comparar solamente la diagonal para decidir si una matriz es simétrica.
  • Confundir una matriz simétrica con una matriz cuyos elementos parecen visualmente equilibrados.
  • Almacenar n² valores cuando la estructura permite una representación compacta mucho menor.

8.19 Qué debes recordar de este tema

  • Una matriz diagonal tiene ceros fuera de la diagonal principal.
  • Toda matriz diagonal es triangular superior, triangular inferior y simétrica.
  • Una triangular superior tiene ceros debajo de la diagonal.
  • Una triangular inferior tiene ceros encima de la diagonal.
  • El determinante de una matriz triangular es el producto de su diagonal.
  • Una matriz simétrica cumple A = AT y aij = aji.
  • Estas estructuras permiten reducir cálculos y almacenamiento.

8.20 Conclusión

Las matrices diagonales, triangulares y simétricas poseen patrones que simplifican operaciones y permiten algoritmos especializados. Identificar esos patrones evita recorrer o almacenar elementos cuyo valor ya conocemos por la estructura.

En el próximo tema estudiaremos la igualdad de matrices y las condiciones exactas que deben cumplir dos matrices para considerarse iguales.