La transpuesta intercambia las filas y las columnas de una matriz. Esta operación cambia el orden de una matriz rectangular y permite expresar simetrías, productos y transformaciones de datos.
Transponer una matriz significa convertir sus filas en columnas y sus columnas en filas. Los valores no se modifican: solamente cambian de posición.
La transpuesta aparece al trabajar con vectores fila y columna, matrices simétricas, productos matriciales, conjuntos de datos y sistemas de ecuaciones.
La transpuesta de A se representa como AT. Si A = [aij], entonces:
El primer índice se convierte en segundo y el segundo se convierte en primero. El elemento ubicado en la fila i y columna j de A aparece en la fila j y columna i de AT.
Si A tiene orden m × n, su transpuesta tiene orden n × m.
| Orden de A | Orden de AT | Cambio |
|---|---|---|
| 1 × 4 | 4 × 1 | Fila a columna |
| 3 × 1 | 1 × 3 | Columna a fila |
| 2 × 3 | 3 × 2 | Rectangular |
| 3 × 3 | 3 × 3 | Conserva el orden cuadrado |
La cantidad total de elementos permanece igual: m · n = n · m.
La primera fila [1, 2, 3] se convierte en la primera columna. La segunda fila [4, 5, 6] se convierte en la segunda columna.
const A = [[1, 2, 3], [4, 5, 6]];
const AT = A[0].map((_, columna) =>
A.map(fila => fila[columna])
);
console.log(AT);
console.log(`Orden: ${AT.length} × ${AT[0].length}`);
La transpuesta convierte un vector fila en un vector columna y viceversa.
const vectorFila = [[2, 5, 7]];
const vectorColumna = vectorFila[0].map(valor => [valor]);
const filaRecuperada = [vectorColumna.map(fila => fila[0])];
console.log(vectorColumna);
console.log(filaRecuperada);
Para formar cada fila del resultado, tomamos una columna completa de la matriz original.
function transponer(matriz) {
const filas = matriz.length;
const columnas = matriz[0].length;
const resultado = Array.from({ length: columnas }, () =>
Array(filas)
);
for (let i = 0; i < filas; i++) {
for (let j = 0; j < columnas; j++) {
resultado[j][i] = matriz[i][j];
}
}
return resultado;
}
console.log(transponer([[1, 2, 3], [4, 5, 6]]));
La asignación resultado[j][i] = matriz[i][j] traduce directamente la definición matemática.
Podemos comprobar posiciones específicas para entender el intercambio de índices.
const A = [[10, 20, 30], [40, 50, 60]];
const AT = A[0].map((_, j) => A.map(fila => fila[j]));
console.log("a₁₂:", A[0][1]);
console.log("(Aᵀ)₂₁:", AT[1][0]);
console.log("a₂₃:", A[1][2]);
console.log("(Aᵀ)₃₂:", AT[2][1]);
La transpuesta de la transpuesta recupera la matriz original. Por eso se dice que la transposición es una operación involutiva.
const transponer = matriz => matriz[0].map((_, j) =>
matriz.map(fila => fila[j])
);
const A = [[1, 2, 3], [4, 5, 6]];
const dobleTranspuesta = transponer(transponer(A));
console.log(dobleTranspuesta);
La transposición se distribuye respecto de la suma y de la resta.
const transponer = M => M[0].map((_, j) => M.map(fila => fila[j]));
const sumar = (A, B) => A.map((fila, i) =>
fila.map((valor, j) => valor + B[i][j])
);
const A = [[1, 2, 3], [4, 5, 6]];
const B = [[6, 5, 4], [3, 2, 1]];
console.log(transponer(sumar(A, B)));
console.log(sumar(transponer(A), transponer(B)));
El escalar puede aplicarse antes o después de transponer.
const transponer = M => M[0].map((_, j) => M.map(fila => fila[j]));
const escalar = (M, k) => M.map(fila => fila.map(valor => k * valor));
const A = [[1, 2, 3], [4, 5, 6]];
const k = -2;
console.log(transponer(escalar(A, k)));
console.log(escalar(transponer(A), k));
Al transponer un producto matricial debemos transponer cada factor e invertir su orden.
El orden se invierte porque las filas de AB deben convertirse en columnas compatibles en el producto transpuesto.
const transponer = M => M[0].map((_, j) => M.map(fila => fila[j]));
const multiplicar = (A, B) => A.map(fila =>
B[0].map((_, j) =>
fila.reduce((suma, valor, k) => suma + valor * B[k][j], 0)
)
);
const A = [[1, 2, 3], [4, 5, 6]];
const B = [[1, 2], [3, 4], [5, 6]];
console.log(transponer(multiplicar(A, B)));
console.log(multiplicar(transponer(B), transponer(A)));
Escribir ATBT sin invertir los factores es un error frecuente.
Una matriz cuadrada es simétrica si coincide con su transpuesta.
function esSimetrica(A) {
const n = A.length;
if (!n || !A.every(fila => fila.length === n)) return false;
return A.every((fila, i) =>
fila.every((valor, j) => valor === A[j][i])
);
}
console.log(esSimetrica([[2, 5, 1], [5, 3, 7], [1, 7, 4]]));
Una matriz antisimétrica cumple AT = -A. Sus elementos reflejados tienen signos opuestos y su diagonal principal contiene ceros.
function esAntisimetrica(A) {
const n = A.length;
if (!n || !A.every(fila => fila.length === n)) return false;
return A.every((fila, i) =>
fila.every((valor, j) => valor === -A[j][i])
);
}
const A = [[0, 2, -3], [-2, 0, 4], [3, -4, 0]];
console.log(esAntisimetrica(A));
Para cualquier matriz real A, los productos ATA y AAT son simétricos, aunque A sea rectangular.
const transponer = M => M[0].map((_, j) => M.map(fila => fila[j]));
const multiplicar = (A, B) => A.map(fila =>
B[0].map((_, j) =>
fila.reduce((suma, valor, k) => suma + valor * B[k][j], 0)
)
);
const A = [[1, 2, 3], [4, 5, 6]];
const gram = multiplicar(transponer(A), A);
console.log(gram);
console.log(transponer(gram));
ATA recibe el nombre de matriz de Gram de las columnas de A.
Si las filas representan observaciones y las columnas características, transponer intercambia esos papeles.
const notas = [
[8, 7, 9],
[6, 8, 7],
[9, 10, 8],
[7, 6, 8]
];
const porEvaluacion = notas[0].map((_, j) =>
notas.map(estudiante => estudiante[j])
);
console.log(porEvaluacion);
La operación no cambia los datos, pero modifica la forma en que se recorren y agrupan.
Una función segura comprueba que la entrada sea una matriz rectangular no vacía.
function transponer(matriz) {
if (!Array.isArray(matriz) || matriz.length === 0) {
throw new Error("La matriz no puede estar vacía");
}
if (!matriz.every(fila => Array.isArray(fila))) {
throw new Error("Cada fila debe ser un arreglo");
}
const columnas = matriz[0].length;
if (!columnas || !matriz.every(fila => fila.length === columnas)) {
throw new Error("La matriz debe ser rectangular");
}
return Array.from({ length: columnas }, (_, j) =>
matriz.map(fila => fila[j])
);
}
console.log(transponer([[1, 2, 3], [4, 5, 6]]));
Una matriz cuadrada puede transponerse en el lugar intercambiando los elementos a ambos lados de la diagonal.
const A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
for (let i = 0; i < A.length; i++) {
for (let j = i + 1; j < A.length; j++) {
[A[i][j], A[j][i]] = [A[j][i], A[i][j]];
}
}
console.log(A);
Los errores frecuentes son cambiar los valores en lugar de las posiciones, no invertir las dimensiones, confundir transpuesta con inversa, olvidar invertir los factores de un producto y usar transposición en el lugar sobre una matriz rectangular.
La transpuesta reorganiza una matriz sin alterar sus valores. Su aparente sencillez permite relacionar filas con columnas, expresar simetrías y transformar correctamente sumas y productos.
En el próximo tema estudiaremos la traza de una matriz, una operación que suma los elementos de la diagonal principal.