Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Mnożenie macierzy
Forum PHP.pl > Forum > Przedszkole
Koxcon
Witam,

Na wstępie zaznaczę, iż dopiero zaczynam przygodę z PHP.

Chciałem napisać funkcję, która będzie mnożyć macierze dowolnych wymiarów, mam coś takiego:
  1. function mnoz_macierz($m1,$m2){
  2. $r=count($m1);
  3. $c=count($m2[0]);
  4. $p=count($m2);
  5. if(count($m1[0])!=$p){throw new Exception('Incompatible matrixes');}
  6. $m3=array();
  7. for ($i=0;$i< $r;$i++){
  8. for($j=0;$j<$c;$j++){
  9. $m3[$i][$j]=0;
  10. for($k=0;$k<$p;$k++){
  11. $m3[$i][$j]=$m3[$i][$j]+$m1[$i][$k]*$m2[$k][$j];
  12. }
  13. }
  14. }
  15. return($m3);
  16. }


I dopóki mnożę macierze kwadratowe, to funkcja działa bez problemu. Ale gdy chcę wykonać mnożenie np. macierzy 2x2 i 2x1, to funkcja w wyniku podaje macierz 2x1 o wszystkich wartościach równych 0. Czy byłby ktoś w stanie mi podpowiedzieć, co tu jest nie tak?

Pozdrawiam,
Koxcon
Kshyhoo
Znalezione:
  1. function mnozenie($m1, $m2) {
  2. // sprawdzam, czy tablice są poprawnie skonstruowane
  3. if (!sprawdz($m1) or !sprawdz($m2)) return false;
  4. // liczba kolumn w m1 musi byc równa liczbie wierszy w m2
  5. if (count($m1[0])<>count($m2)) return false;
  6. // mnożenie
  7. for($x=0;$x<count($m1);$x++) {
  8. for($y=0;$y<count($m2[0]);$y++) {
  9. for($z=0;$z<count($m1[0]);$z++)
  10. $m3[$x][$y] += $m1[$x][$z]*$m2[$z][$y];
  11. }
  12. }
  13. return $m3;
  14. }
  15.  
  16. function sprawdz($m) {
  17. // sprawdzam czy tablica nie jest pusta
  18. if (count($m)<1) return false;
  19. // sprawdzam czy tablica ma tyle samo kolumn w kazdym rzedzie
  20. foreach($m as $rzad) {
  21. $ile = count($rzad);
  22. if (!isset($pop)) $pop=$ile;
  23. if ($pop<>$ile) return false;
  24. $pop=$ile;
  25. }
  26. return true;
  27. }
Koxcon
Niestety, w wyniku dalej są same zera
Kshyhoo
A tak:
  1. $m1 = array(
  2. array(1, -1, 3),
  3. array(4, 4, 2)
  4. );
  5. $m2 = array(
  6. array(2, -1),
  7. array(3, 2),
  8. array(6, 7)
  9. );
  10.  
  11. $wynik = mnozenie($m1, $m2);
  12.  
  13. echo "<pre>";
  14. print_r($wynik);
  15. echo "</pre>";

?
Koxcon
Działa, teraz dopiero zauważyłem, że problemem nie była funkcja, a źle zapisana jedna z macierzy, dzięki wielkie za pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.