Adloun

Écrire matrice identite(n) par compréhension

Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 4 — Les types construits · Matrices

Énoncé

Écrire matrice_identite(n) par compréhension. Vérifier sur matrices aléatoires qu'elle est neutre pour le produit, des deux côtés. Pourquoi faut-il tester les deux côtés ?

Corrigé


def matrice_identite(n):
    """Matrice identite de taille n x n. Precondition : n >= 1."""
    assert n >= 1
    return [[1 if i == j else 0 for j in range(n)] for i in range(n)]

L'expression 1 if i == j else 0 est une conditionnelle écrite comme une valeur : elle rend sur la diagonale, ailleurs. On aurait pu écrire une double boucle avec append, mais la compréhension dit ici exactement la définition — « la case vaut si ».

Vérification.


assert matrice_identite(1) == [[1]]
assert matrice_identite(3) == [[1, 0, 0], [0, 1, 0], [0, 0, 1]]

for _ in range(200):
    n, p = random.randint(1, 5), random.randint(1, 5)
    a = [[random.randint(-9, 9) for _ in range(p)] for _ in range(n)]
    assert produit_matrices(matrice_identite(n), a) == a      # I_n x A = A
    assert produit_matrices(a, matrice_identite(p)) == a      # A x I_p = A

Les matrices passent, des deux côtés.

Pourquoi les deux côtés. Pour deux raisons de nature très différente.

Sur une matrice carrée, une inversion d'indices ne provoque aucune erreur — c'est l'avertissement du cours. C'est pourquoi les tests emploient ici des matrices rectangulaires tirées au hasard, avec et indépendants.

Les autres exercices de ce chapitre Le cours du chapitre

Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.