0
votes

Comment puis-je refacturer beaucoup de boucles imbriquées similaires dans ma classe matricielle?

Comment puis-je refactuer correctement ma classe matricielle où presque toutes les méthodes que j'utilises dans cette classe ont des boucles à double imbrication qui ressemblent à presque exactement la même chose?

Voici deux de nombreuses méthodes que je souhaite inclure dans cette classe . Cela va être inutilement long si je ne trouve pas de meilleure façon de faire face à cela. P>

randomize() {
    for (let i = 0; i < this.rows; i++) {
        for (let j = 0; j < this.cols; j++) {
            this.matrix[i][j] = Math.random();
        }
    }
}

add(n) {
    if (n instanceof Matrix) {
        for (let i = 0; i < this.matrix.length; i++) {
            for (let j = 0; j < this.matrix[i].length; j++) {
                this.matrix[i][j] += n.matrix[i][j];
            }
        }
    } else {
        for (let i = 0; i < this.matrix.length; i++) {
            for (let j = 0; j < this.matrix[i].length; j++) {
                this.matrix[i][j] += n;
            }
        }
    }
}


4 commentaires

Est-ce que this.rows == this.matrix.length ? et est-ce que ceci.cols == this.matrix []. longueur ? J'ai supposé que les matrices sont rectangulaires (c'est-à-dire que toutes les lignes ont le même nombre de colonnes)?


Oui, ils sont rectangulaires.


Comment this.Rows / ceci.cols concerne les dimensions de this.matrix ?


Ceci est juste une propriété de l'objet. M'a permis d'éviter ces longs cette longueur.Matrix [i] .length. Le rend propre, par exemple. lors de la vérification de la validité de la multiplication matricielle.


3 Réponses :


1
votes

Utilisez une fonction de commande supérieure, qui reçoit une fonction à appeler sur chaque élément et renvoie la nouvelle valeur pour le remplacer.

Dans mon exemple ci-dessous, la fonction de rappel reçoit également les index. Il peut donc les utiliser. Pour référencer une autre matrice, qui est nécessaire dans la méthode Ajouter code>. p>

p>

updateEach(callback) {
  for (let i = 0; i < this.rows; i++) {
    for (let j = 0; j < this.cols; j++) {
      this.matrix[i][j] = callback(this.matrix[i][j], i, j);
    }
  }
}

randomize() {
  this.updateEach(() => Math.random());
}

add(n) {
  if (n instanceof Matrix) {
    this.updateEach((oldval, i, j) => oldval + n.matrix[i][j]);
  } else {
    this.updateEach((oldval) => oldval + n)
  }
}


0 commentaires

2
votes

Semblable à la réponse de Barmar Juste avec une saveur différente: xxx pré>

Cette approche plus générique vous permet de faire ce que vous voulez avec les indices de boucle. Vous pourrait em> faire réaffectation ou vous pouvez vous déconnecter des valeurs matricielles ou les attribuer à une nouvelle matrice. P>

loop(this.rows, this.cols, (i, j) => {
    that.matrix = this.matrix[i][j];
});


1 commentaires

Merci. Cette solution semble intéressante, mais la solution Barmars sera de plus utile pour moi. Pourrait revenir à cette solution dans des projets ultérieurs.



1
votes

Vous pouvez utiliser une fonction.

p>

class Matrix {
  constructor(arr) {
    this.matrix = arr;
    this.rows = arr.length;
    this.cols = arr[0].length;
  }
  loop(func, arr2, arr2Recurse) {
    this.matrix = this.matrix.map((row, i) =>
      row.map((col, j) => func(col, arr2Recurse ? arr2.matrix[i][j] : arr2))
    );
  }
  randomize() {
    this.loop(() => Math.random());
  }
  add(n) {
    this.loop((el, nEl) => (el += nEl), n, n instanceof Matrix);
  }
}
var a = new Matrix([[1, 2], [3, 4]]);
var b = new Matrix([[5, 6], [7, 8]]);
a.add(b);
console.log(a);
a.add(1);
console.log(a);
a.randomize();
console.log(a);


2 commentaires

Ces fonctions ne fonctionnent pas. Dans "boucle", les arguments ne sont pas correctement passés à Func. Dans Randomize, vous ne faites pas de réaffectation d'une valeur de la matrice. Ajouter réaffectait l'indice de colonne qui est transmis, pas la valeur matricielle.


@Michael merci. Je crois que je l'ai réparé.