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; } } } }
3 Réponses :
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 p> Ajouter code>. 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)
}
}
Semblable à la réponse de Barmar Juste avec une saveur différente: 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];
});
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.
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);
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é.
Est-ce que
this.rows == this.matrix.length code>? et est-ce que
ceci.cols == this.matrix []. longueur code>? 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 code> /
ceci.cols code> concerne les dimensions de
this.matrix code>?
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.