Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]Mnożenie macierzy
Koxcon
post 19.07.2015, 13:27:31
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 19.07.2015

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Kshyhoo
post 19.07.2015, 15:14:27
Post #2





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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. }


--------------------
Go to the top of the page
+Quote Post
Koxcon
post 19.07.2015, 15:28:57
Post #3





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 19.07.2015

Ostrzeżenie: (0%)
-----


Niestety, w wyniku dalej są same zera
Go to the top of the page
+Quote Post
Kshyhoo
post 19.07.2015, 15:37:39
Post #4





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




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>";

?


--------------------
Go to the top of the page
+Quote Post
Koxcon
post 19.07.2015, 16:16:56
Post #5





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 19.07.2015

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 4.05.2025 - 05:58