Trasposizione matrice

di il
9 risposte

Trasposizione matrice

Ciao a tutti. Ho una matrice NxM che ho dichiarato come : const arr=[]. L'ho popolata con numeri casuali. Fin qui tutto bene e non posto il codice per non essere noioso.Se inserisco 2x3 in input ,per esempio,mi visualizza la matrice. Ora vorrei provare a fare la trasposta della stessa matrice. Quindi invertire le righe con le colonne. Ho provato con il solito doppio ciclo in questo modo:

for(let x=0; x < N; x++){
      
        for(let y=0; y < M; y++){
          
          arrF[y][x]=arr[x][y];
            }
      }
Ovviamente non funziona. Vedendo un pò di documentazione in javascript ho trovato la soluzione sopra, cioè:
arrF[y][x]=arr[x][y].
Ma mi dà errore.Non riesco a capire perchè e cosa manca. Spero di essere stato chiaro

9 Risposte

  • Re: Trasposizione matrice

    tonyven ha scritto:


    Vedendo un pò di documentazione in javascript ho trovato la soluzione sopra, cioè:
    arrF[y][x]=arr[x][y].
    Ma mi dà errore.
    Come è stato inizializzata la variabile arrF?
    O hai iniziato a usarla direttamente in quell'istruzione?
  • Re: Trasposizione matrice

    Cosa vuol dire ti dà errore? Quale errore? Hai letto cosa dice il messaggio d'errore?

    Leggilo bene e capirai
  • Re: Trasposizione matrice

    Ciao. Ho ricontrollato l'errore del listato a quella riga e mi dà errore:
    TypeError: Cannot set properties of undefined (setting '0')
    Posto il codice magari si capisce meglio. La variabile arrF l'ho inizializzata all'inizio ponendo un array vuoto.
    Se è settata perchè mi dice che invece è 0?
    
    const readline = require('readline').createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    readline.question(`Input:   `, num => {
      let N = parseInt(num.charAt(0));
      let M = parseInt(num.charAt(2));
      const arr = [];
      const arrF = [];
      let arrR1 = 0;
      let arrR2 = 0;
      let numRnd = 0;
    
      for (let i = 0; i < N; i++) {        //crea una matrice di righe e colonne
        numRnd = Math.floor(Math.random() * 100) + 1;
        arr.push([numRnd]);
    
        for (let j = 0; j < M; j++) {
          arr[i][j] = Math.floor(Math.random() * 100) + 1;
          arrR1 += arr[i][j];
        }
    
        arrR1 = 0;  //variabile che permette la somma di ogni elemento nell'array multidimensionale
      }
    
      for (let x = 0; x < N; x++) {
    
        for (let y = 0; y < M; y++) {
    
          arrF[y][x] = arr[x][y];
        }
      }
    
    
    
      /* function transpose(original) {
          var copy = [];
           for (var i = 0; i < original.length; ++i) {
              for (var j = 0; j < original[i].length; ++j) {
                  if (original[i][j] === undefined) continue;
                    if (copy[j] === undefined) 
                     copy[j] = [];
                      copy[j][i] = original[i][j];
                      } } return copy; 
                     }
                      console.log(transpose([ [1,2,3], [4,5,6], [7,8,9] ])); */
      console.log(arr);
      console.log(arrF);
      readline.close();
    });
    
  • Re: Trasposizione matrice

    tonyven ha scritto:


    La variabile arrF l'ho inizializzata all'inizio ponendo un array vuoto.
    Se è settata perchè mi dice che invece è 0?
    Se hai inizializzato arrF con un array vuoto, vuol dire che hai creato appunto un array vuoto, ossia privo di elementi, e puoi inserirne di nuovi "dinamicamente" con push(), ma non puoi usare un indice per accedere all'elemento i-esimo poiché questo ancora non esiste.

    Se accedi all'array usando un indice (es. arrF[1]), questo non funzionerà poiché... l'hai detto tu, l'array è vuoto.

    La soluzione quindi non è creare un array vuoto ma crearne uno che già allochi lo spazio necessario per gli elementi che devi solo valorizzare, ossia dare una lunghezza all'array. Oppure, come predetto, lasciarlo vuoto ma usare push() per aggiungere elementi.

    Attenzione che stai lavorando con una matrice, ossia un array di array, quindi ciò significa che per poter scrivere qualcosa del tipo arr[x][y] dovrai ripetere la cosa al secondo livello. Mi spiego: pur dimensionando già dall'inizio la dimensione dell'array, ciascuno dei suoi elementi è di nuovo un array, quindi dovrà essere inizializzato allo stesso modo, ovvero dovrai dimensionare il primo livello e, per ciascun elemento, assegnare come valore un array anch'esso dimensionato per contenere i valori di secondo livello, ossia i valori numerici.

    Un pezzo di codice per spiegare:
    
    // Dimensiona l'array di primo livello.
    let a = new Array(N);
    
    // Ciascun elemento dell'array è a sua volta un array (di secondo livello).
    a[0] = new Array(M);
    
    // Usando gli indici, si accede all'array di primo livello
    // poi a quello di secondo livello, salvando il valore numerico.
    a[i][j] = Math.random();
    
    Ciao!
  • Re: Trasposizione matrice

    Se vuoi un altro consiglio, per un codice chiaro, riscrivi il programma usando MAXR e MAXC al posto di N ed M ed anche r c al posto di i j
  • Re: Trasposizione matrice

    La procedura l'ho compresa. Il problema è che non riesco a implementare il codice per fare la trasposta di un array che già ho popolato.Come si vede dal codice postato sopra. Va quindi creato un nuovo array per la trasposta? Ho provato ad assegnare il valore dell'array che già ho a quello nuovo ,ma da errore;
    arrM[c][r]=arr[r][c]

    perchè arrM è effettivamente vuoto. Ma allora se devo popolare arrM mi ritrovo con un altro array con altri valori diversi da arr. E' qui che mi impiccio.
  • Re: Trasposizione matrice

    Non devi "provare", non si programma per tentativi a caso.

    Tu devi studiare e leggere quello che ti viene suggerito. Leggi quello che ti ho scritto alka e adottato nel tuo codice. Non è difficile quinci ci puoi riuscire con un poco di impegno
  • Re: Trasposizione matrice

    tonyven ha scritto:


    La procedura l'ho compresa. Il problema è che non riesco a implementare il codice [...]
    Veramente, di tutto ciò che hai detto, io non trovo un solo riferimento a quello che ti ho spiegato.
    Al netto che le mie erano solo proposte, se hai dei dubbi a riguardo puoi sempre chiedere.

    Se invece ignori completamente tutto ciò che viene detto e non ragioni sui suggerimenti ma continui a perseguire altri binari, basta saperlo prima che ci risparmiamo il tempo.

    Il problema in ogni caso è presto detto: stai facendo il proverbiale "passo più lungo della gamba".

    Inizia con un esercizio più semplice, creando un array vuoto, poi un array di N elementi, poi un array di array, e aggiungi via via altre implementazioni, come la valorizzazione usando numeri fissi, poi casuali ecc. fino ad arrivare all'esercizio che ti è stato assegnato.

    Se invece eludi qualsiasi ragionamento e non ragioni sui consigli, e vai totalmente a caso (o quasi), non arriverai mai in fondo alla questione.

    Ciao!
  • Re: Trasposizione matrice

    Ciao a tutti. Finalmente sono riuscito a venirne a capo. Grazie a qualche cazziatone e ostinazione il codice ora funziona.
    
    const readline = require('readline').createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    readline.question(`Input:   `, num => {
      let MAXR = parseInt(num.charAt(0));
      let MAXC = parseInt(num.charAt(2));
      const arr = [];
      let arrM = [];
      let arrR1 = 0;
      let numRnd = 0;
    
      for (let i = 0; i < MAXR; i++) {        //crea una matrice di righe e colonne
        numRnd = Math.floor(Math.random() * 100) + 1;
        arr.push([numRnd]);
    
        for (let j = 0; j < MAXC; j++) {
          arr[i][j] = Math.floor(Math.random() * 100) + 1;
          arrR1 += arr[i][j];
        }
        arrR1 = 0;  //variabile che permette la somma di ogni elemento nell'array multidimensionale
      }
    
    
      for (let r = 0; r < arr.length; ++r) {
    
        for (let c = 0; c < arr[r].length; ++c) {
    
          if (arrM[c] === undefined)
            arrM[c] = [];
          arrM[c][r] = arr[r][c];
        }
    
    
      }
      console.log(arr);
      console.log(arrM);
      readline.close();
    });
    
Devi accedere o registrarti per scrivere nel forum
9 risposte