Ottenere la matrice trasposta in JavaScript

La matrice trasposta è un concetto fondamentale nell'algebra lineare e trova applicazione in diverse aree come l'analisi dei dati, la grafica computerizzata, la risoluzione di sistemi di equazioni lineari e molto altro. La trasposizione di una matrice consiste nell'invertire le sue righe con le colonne, trasformando così la colonna n-esima della matrice originale nella riga n-esima della matrice trasposta. Questa operazione è di grande utilità in programmazione, in particolare quando si lavora con linguaggi come JavaScript per manipolare dati o risolvere problemi matematici. In questa pagina, esploreremo come calcolare la matrice trasposta di una matrice in JavaScript, presentando diversi approcci e tecniche.

Concetti di base

Una matrice in JavaScript è rappresentata come un array di array, dove ogni sotto-array rappresenta una riga della matrice. Per esempio, consideriamo la seguente matrice 3x2:

let matrice = [
	[1, 2],
	[3, 4],
	[5, 6]
];

La matrice trasposta corrispondente sarà 2x3, così formata:
[
  [1, 3, 5],
  [2, 4, 6]
]

Come ottenere la matrice trasposta in JavaScript

Il modo più diretto per ottenere la matrice trasposta implica l'uso di cicli annidati per iterare attraverso le colonne e le righe della matrice originale, assegnando ciascun elemento alla posizione corrispondente nella nuova matrice trasposta.

function trasponiMatrice(matrice) {
	let trasposta = [];
	for (let i = 0; i < matrice[0].length; i++) {
		trasposta[i] = [];
		for (let j = 0; j < matrice.length; j++) {
			trasposta[i][j] = matrice[j][i];
		}
	}
	return trasposta;
}

Questo approccio è intuitivo e semplice da comprendere, ma può diventare verboso per matrici di grandi dimensioni.

Un metodo più conciso per ottenere la matrice trasposta in JavaScript sfrutta il metodo map degli array, combinato con l'uso dello spread operator e la funzione Array.from per creare la matrice trasposta in modo più funzionale.

function trasponiMatrice(matrice) {
	return matrice[0].map((_, colIndex) => matrice.map(riga => riga[colIndex]));
}

In questo frammento di codice, map viene utilizzato due volte: la prima per iterare su ogni colonna della matrice originale (usando l'indice di colonna colIndex), e la seconda per selezionare l'elemento corrispondente da ogni riga, costruendo così la nuova matrice trasposta.

Considerazioni sulla performance

Per matrici di piccole dimensioni, la differenza di performance tra i due metodi è trascurabile. Tuttavia, per matrici molto grandi, è importante valutare l'overhead introdotto dall'approccio funzionale, specialmente in termini di memoria e tempo di esecuzione, rispetto al metodo più diretto dei cicli annidati. La scelta dell'approccio dipenderà dalle specifiche esigenze di performance e leggibilità del codice.

Conclusioni

Calcolare la matrice trasposta in JavaScript è un'operazione fondamentale che mostra la potenza e la flessibilità del linguaggio nel manipolare strutture dati complesse. Che si preferisca un approccio imperativo basato su cicli annidati o uno più dichiarativo e funzionale, è essenziale padroneggiare queste tecniche per chi lavora con matrici in ambiti matematici, scientifici, o di elaborazione dati.