Aller au contenu

Matrice creuse⚓︎

Une matrice est appelée matrice creuse si de nombreux coefficient sont nuls.

On considère des matrices carrées à \(n\) lignes et \(n\) colonnes. Le nombre de coefficients est donc \(n^2\). Dans une matrice creuse le nombre de coefficients non nuls est de l'ordre de \(n\).

Par exemple, la matrice: \(\begin{pmatrix} 0 & 1 & 0 & 0 & 0 \\ 1 & -1 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0 & 0 \\ 0 & 0 & -2 & 1 & 0 \\ 0 & 0 & 0 & 0 & 3 \\ \end{pmatrix}\)

Cette matrice est représentée en Python par: m = [[0, 1, 0, 0, 0], [1, -1, 0, 0, 0], [0, 0, 2, 0, 0], [0, 0, -2, 1, 0], [0, 0, 0, 0, 3]]

Plutôt que de stocker toute la matrice, soit \(n^2\) coefficients, on utilise trois tableaux pour ne stocker que les coefficients non nuls de la matrice qui est parcourue ligne par ligne. On note \(n\) le nombre de lignes et \(nb\) le nombre de coefficients non nuls. Les trois tableaux sont définis ainsi:

  • un tableau valeurs de taille \(nb\) qui contient les \(nb\) coefficients non nuls;

  • un tableau colonnes de taille \(nb\) qui contient les indices des colonnes des coefficients non nuls (colonnes[k] est l'indice de la colonne contenant valeurs[k]);

  • un tableau lignes de taille \(n+1\) tels que lignes[0] vaut 0, pour \(0 < k < n\), lignes[k] est l'indice dans le tableau valeurs du premier coefficient non nul de la ligne \(k\) ou bien lignes[k-1] si tous les coefficients de la ligne \(k\) sont nuls, lignes[n] est le nombre de coefficients non nuls.

Ainsi, lignes[k+1] - lignes[k] est le nombre de coefficients non nuls de la ligne \(k\).

Par exemple, avec la matrice m, \(n = 5\), \(nb=7\), on obtient les trois tableaux valeurs, colonnes, lignes:

[1, 1, -1, 2, -2, 1, 3], les coefficients non nuls rencontrés suivant l'ordre ligne par ligne, colonne par colonne;

[1, 0, 1, 2, 2, 3, 4], les indices des colonnes auxquelles appartiennent les coefficients non nuls;

[0, 1, 3, 4, 6, 7], \(1-0\) est le nombre de coefficients non nuls de la ligne d'indice \(0\), \(3-1\) est le nombre de coefficients non nuls de la ligne d'indice \(1\), \(4-3\) est le nombre de coefficients non nuls de la ligne d'indice \(2\), \(6-4\) est le nombre de coefficients non nuls de la ligne d'indice \(3\), \(7-6\) est le nombre de coefficients non nuls de la ligne d'indice \(4\), $7 est le nombre total de coefficients non nuls.

Cette représentation consomme moins d'espace en mémoire. On rencontre des matrices creuses en particulier dans la résolution de systèmes linéaires. C'est aussi le cas avec la matrice d'adjacence d'un graphe comportant peu d'arêtes.

Question 1

Écrire la fonction stockage qui prend en paramètre une matrice, représentée par une liste de listes comme ci-dessus et renvoie les trois tableaux valeurs, colonnes, lignes.

Pour cela commencer par parcourir la matrice ligne par ligne, colonne par colonne, pour compter le nombre d'éléments non nuls. Créer ensuite les trois tableaux aux bonnes dimensions, initialement remplis de 0. Parcourir à nouveau la matrice, et à chaque coefficient non nul rencontré, modifier en conséquence les tableaux.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.8217.128013sY3_8èuf^vy n7aS1me(P24C:jtwi]D[h*)6Oo;bcdUgM/0làqp!.r,=+k95Rxé050R0u0C0q0E0X0c0n0Q0X0q0c0c0)010C0E0!010406050c0i0t0t0q0%0m040r0N0X0i140N0o0n020q0t0!0O0n0.0u1e0%0Z0i0u0c050V1b1d1f1h190!041F1M051P0V1P1R1M190R0E0l0|0~10120I0E0T0I0X1)0I0C17050@0P0X0u1!0 11011(1*1,1*0C1=1@1:0C0P0N0R1h1;0%1N0C0I0|1k0c0!0q0o120x011_1$010j0_0u0o1s0u1:2h2j2o1{2r1@2u0t2w040b0n0w0%0N0!0N0c0E1n1p0=2f0%0%0u0Q2R1F2y0o1N0V2d2%0C2b2a2c0R2A121,0o2t2O1:1X1Z0}1`2;0E2?0o271Y1:0!2W1N2#2%381a2i1p2|2p310%1e0X170n0s2!3c183b2z3e1{3g3i3k0x3n2j3p2#2:013u0q3j040n0e3y2$193B3s123E3G0n0y3K3A3c3C3Q3k0-3U3M3W3O3D0N3h3F3k0L3#3q3d1#3t3*3v3H0p3/3N3=3P3@3,3H0g3{3%3}3)3+3R0,433r453Y040s0W4a3;2}463^0s3m1G3o3$4b4j4d0s3x4o3z4q4i3f3 3G0s3J4w3L3:3X4B170s3T4F3V4r4A474K3!4N4y4I4R4e3.4U4H3(4t3`4!3|4s4J4e424)444+4X0s494/4P3?4X0x4g4N1O361F2`2*0R2.3C0Q272G0;1Y1N350u373o3U05570=5f4_120+170=0j5h4*2p0D3k5s4:3f0j170c0C0N0Q0+0q0T0u5x5m0116040v5K4z3t170t5Q3C5N0K0A3#0n5#0n4#4c170o3U5%5t1{0N170)5,5(4s0P172D5V3(5N5P4~5.3P5T5|455X5,5-5y1{0Q0s17030n310t0P2W0n2T1 2?1E4U5$685L0o5*0P5?61015:045=4N6r5R120t0E174}385#5@2p6b6d6f0N6h6j2T570u0j2r0Q0E2t0C0{311p0o0i0`5!5$6M1{5o040j3*6w6962040E6^5L0N5v6{5+6C6/3P5_040%2j5I644j5~7b3f5*7e1{5X5Z6p6q6.6x6;6?0%6}6E3D170B7s3C6 172 7x4$76780o7a606_5M175 3a6x6t04727N7J7j6-7m7m74016;0E5r737O637I5L5N0H7h6`6|7*7t5N0F7-7;3X7v7.7K040F7C456z0#6B6K7Y6G6I7|5N7k38067W8e7n7J7P0o6v7%7J6z843o6D7`7Q8k856x6z0*804j874e7V8q4$5`1)6n8y2p8n8I7i177^7S5L8A6J5g6x7?8L126z0J8W7}7M8T8h7g7_3(8w7|8A4n8P7=170K8C7Y7P570X1o8H8l6~5;8!7,8-6H048S3z7Y8V8~7t8Y8!8i8t4p6q8^170l3F0u0i0%6o8u8m909a5W8N93888*65177 9t8+178Z9C5)8s8@7(9I9G4j8K9M2p8R9J7J7p6@9P5S6{8!7z719d7E795J9y7c7L7|8i898=8b9g8e9i046m1D9/048O8%6s7A9{9B9q8 6A9d6u8C9h7o177qa6047w9W8X707Bag3D9%7G9)8:9u5O9-8)ap5}9:a89?aa6{7$a37t7P5U9*2p92aG9X7:au9z7~9}979KafaM9+7~9Z17838!9RaJ128aax8f6L9K8`8|9`a#7}aP2$9@8ja1aWa5ak7PaS9=a)7X9K9k1@9n9p9~8;9|as9LaTaH9Aa_8o3z8D9HaFbb8Mb8a/7PaLb6aq7@b9a}aQ7Tbd7la a98(ba8p7Y9OaC8ra@ak8,ak8.9S9 9^8Ga.bka$9vbnatbqavaVbJ9sbG8EbC4xbA5L6;2W0C9n7RbDb19lb49{0(ada,0o8}bS7}b_a{8F0Tb}4p1F5j5e4 c80V521F0C54cd2,2(26282*0q1?ca521L5l7t2W0t0f0j0q0+0u0f0I0e171x1z1B1D0n9;971S3p1M0G2j0{0i2?0n1e2+0E0Q1^0Q2W0i0c1^2T0@0_1@bh4j1f2Q0IcU0u0/17090v0o09142F6%098?4N0(0nc+6g6ic%cY0N6W6Y6!0o6$6Q6)6+0{1D0C6k1^0X003*0R6T1^7Yc.2dc;c?04c^c`d0380$060r2 1od21o0n2i0%c+2TcU0%cWd70oc$0$1OcM040M1p2W0o57dddr0{dPdR0{cZ9mc$di1pdL140Q6+6!0%0n0q0l2Xd3cH010T2L0c2n0c0m5C0hc}d32 0:0^2W0{0N0P0C2tc#dK1fd30q6k0E0ccZ0:140c0q2R6k0a0:1Bey0E1o0{0q0i0/6k0:dQ0l0:cHd?6!0X1@0c0$2Jeoe2e4e6e80Cea1DdI1p6#2t2/0=0{e7e9eb6ldo0%dqd73l0We}0W0n0N0ie|e~e eC0ieEeGeW06cOdT0|cY0 d2eU2fdacWdcde6(6fdh0nc$0n2+f1d~ddfr9neper5H1o9ldKdQd$15fE0?e00{0=eJfB0TfDfi1B0EfA8{anfx0vd+cXftdQ1XfC2u1@0KeW0wf1d{cR1^f!ds6xduc:eyc=c@c_0nc{0EebdA3#0Yc,2pf_dwf}0o0k0xc 5,6V6Xfl6#0ce*d|0n2t0l0E2L1pdtdQdvf{dxc^0eg36Cggdbgjdffp0`dVcLcq0z0adjdKf/fe211^78esdJ1B0adJcS5C5Ecyene:g10!1@2Ffxfi2 1XcXfMcH9_d-1oek2ufxe/fjghgEfo6*0`6kcPe0ftcm1@eI5%c7bPc3a.hc0n06fTd|9n0^dkf;h7c*f@7Jg8gwf}gzge6C3F3*0{gW0_gmfl0nhoc)eThr5Lhtekgxc_0*0shx38d20v0:d%6R6!eA1D2icXf,dWcq0ScSeI2+gS0^0cdJgN0~0ncw6Z1,0C0:d|d~0Qfeft0m0!e{g!5F5H1^2Nfzda2Xb.0ud{g}0Q3Fd^h33F0T0:6i0EcGg^1ddmi92L0R0i2Q6k00hof?enf:1ph ek9nh)1Q040z1^0Ci3i55Di75IgO0%eker6XeMh06R0c0Ah6i65GiU0UhA0ud22td|7G0~es0n0z6R5d100u2/0rdLfs0.6 0n0v0z0r0.0Kf0f2i`1tegc$2/j30D0n0r5D78iUj60.0rjaf10n0dfE7qcUgI1V510?0^0`04.

Le produit d'une matrice carrée \(m\) notée \((m_{i j})\) à \(n\) lignes et \(n\) colonnes par un vecteur \(x\) noté \((x_i)\) de taille \(n\) est un vecteur \(y\) noté \((y_i)\) de taille \(n\) tel que pour tout \(i\) de 1 à \(n\), \(y_i = \sum_{k=1}^{n} m_{i k} x_k\)

Par exemple:

\(\begin{pmatrix}0 & 1 & 0 \\1 & -1 & 0 \\0 & 1 & 2\end{pmatrix} \begin{pmatrix} 1 \\ 2 \\ 3\end{pmatrix} = \begin{pmatrix} 0 \times 1 + 1 \times 2 + 0 \times 3 \\ 1 \times 1 - 1 \times 2 + 0 \times 3 \\ 0 \times 1 + 1 \times 2 + 2 \times 3\end{pmatrix} = \begin{pmatrix} 2 \\ -1 \\ 8\end{pmatrix}\)

Avec une matrice creuse, pour obtenir la valeur de \(y_i\), on n'utilise que les coefficients non nuls de la ligne \(i\).

Question 2

Écrire la fonction produit qui prend en paramètres les trois tableaux représentant une matrice creuse m et un tableau représentant le vecteur x et qui renvoie le vecteur y, produit de m par x.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10

.128013s3o8bcdufvg/0ly n7apSr1-me,(P2=4:+jtwki][5h*x)6050h0A0K0t0N0o0b0q0g0o0t0b0b0F010K0N0u010406050b0i0z0z0t0w0p040v0d0o0i0:0d0r050m0`0|0~100^0u04191g051j0m1j1l1g0^0h0N0k0(0*0,0.0R0N0l0R0o1z0R0K0?050Z0f0o0A1u0+0-011y1A1C1A0K1I1K1G0K0f0d0h101H0w1h0K0R0(130b0u0t0r0.0E011M1w010j0#0A0r0t0z0A1G1.1:1^1O1{1K1~200?0a0q0D0w0d0u0d0b0N160r0q0X1,0w0w0A0g2l19230r1h0m1*2y0K1(1%1)0h250.1C0r1}2i1G1r1t0)1N2I0N2K0r1!1s1G0u2r1h2w2y2$0_1/2m2Q1_2V0w0}0o0?0x2v2*0@2)242,1O2.2:0?0E2@1:2_2w2H012~0t2;040c322x0^352|0.383a0G3d342*363j0?0Q3m3f3o3h370d2/390?0V3t2`2+1v2}3y2 040s3D3g3G3i3I3A040e3m1i2!192O2B0h2F360g1!211h3Y1k3W2(1a2^053%0X2#3v3O010M0?0X0j3U3N2R010L0?0q3 3^410r0j0?2Z1!0i2k462{3_0=040C4g3F480?0k390A0i0w0b4m364j0B3m45402-0?3%0o172K4v3/333E4x0?4z4K2x4B474D041S4I4w3w4y4A4M3w0r0?0T4Y4i0?0U0H3t0q4;4S4h4o04184Q044?4n1_0d0?0F4#4C2}0f0?284+414j4l4{4$3_4(4V1z4X5d540.4j0U594 0?0y5p1O0z0N2=4:4=5e4^0p534T1O5004524{4}4N040P5t0.5v0?0n5O014j0O5D4@5q040S5X4~2}0?4`2$064=5K3w3{040j3y5$3p0?0N5@3w0d43042T5{5f56040w1:0l0A5T5b5T5g5*3:5l5U4-4/4{5,5-5z6f5:5=0w614^0M6r4 5~605J5A2-63650r67690?5c2(6f5g4W0A4J6I5E5m0?5N5k6P375_6F040O4P2$5.5f575i6M6X6S6O5Y5(5 5T5G0I5T5Q042?6T6.6Q6Y4.5y6l6l6z6/0J6u5F51763i4E134H6*6{5%6}6,6e6U5g6t7f5L5W6j7171737a045C7n4Z6R6b6W7x4,6Y79015G5I6#7t6V7v6+7A6:7C5a0?7p7J6f6=7F5g4q1K4t6N7j6|6g5M7O7m6-7g7)7T2^6$415G5#6y6J4)7N7Q4U757}1O5V707=1_5:2r0K4t6d33846/7w5+193=0A2y2Z8i3X1s3Z2B2D2z1Z1#2B0t1J8l0m3Y0^8y0Y0!0$04.