Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Klasa do działań na macierzach
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
shinuexx
Witam
Zamieszczam stworzoną przez siebie prostą klasę do działań na macierzach, nie wszystko na nich można wykonać ale coś jest.
http://student.agh.edu.pl/~shinuexx/matrix.class.txt /* offline - nowa wersja - patrz niżej */
sposób użycia
  1. <?php
  2. include "priarr.php"; // nieistotne w dzialaniu klasy
  3. include "matrix.class.php";
  4.  
  5. $test=new Matrix(3,3,1);
  6.  
  7. $test->printMatrix();
  8.  
  9. print_var($test->detMatrix());
  10.  
  11. $test->exampleMatrix(true);
  12.  
  13. $test->printMatrix();
  14.  
  15. print_var($test->detMatrix());
  16.  
  17. unset ($test)
  18. ?>


wygląd
  1. questionmark.gif?Matrix was created
  2. [ 1 1 1]
  3. [ 1 1 1]
  4. [ 1 1 1]
  5. integer (0)
  6. [ 9 -7 -3]
  7. [ -7 0 -10]
  8. [ 7 -9 -4]
  9. integer (-313)
  10. Matrix was destroyed

Jeśli są jakieś błędy to pisać. Jeszcze postaram się trochę usprawnić klasę, ale na razie się sesja zbliża;P



Kolejna wersja klasy:
Matrix.class.php

Zmiany:
Kod
#2.000
- usunięto zmienne publiczne $error oraz $errstr
+ dodano zmienną prywatną $scale odpowiedzialną za precyzję wyświetlania liczb przez sprintf
+ dodano metodę prywatną Matrix::_checkDimension odpowiedzialną za sprawdzenie wymiarów tablicy wejściowej do klasy
+ dodano obsługę wyjatków
+ dodano metodę publiczną Matrix::getScale() zwracającą aktualną precyzję wyświetlania liczb
+ dodano skalowanie do wyświetlania macierzy - metoda Matrix::scale();
- wyłączono metody Matrix::eigenvalues() oraz Matrix::eigenvectors()
* zoptymalizowano część operacji na macierzy diagonalnej
+ dodano klasę MatrixException obsługującą wyjątki klasy Matrix
+ dodano metody Matrix::max() oraz Matrix::min() zwracające największą/najmniejszą wartość w macierzy/wierszu/kolumnie


Krótki opis:
  1. <?php
  2. /*
  3.   Przykład zastosowania klasy
  4.   wszelkie działania jak również definiowanie obiektu należy robić w bloku try{}catch(){}
  5. */
  6. include("Matrix.class.php");
  7.  
  8. /* definiowanie obiektu */
  9.  
  10. try{
  11. $m1 = new Matrix(array(1,2,3,4,5,4,42)); /* zwykła tablica */
  12.  
  13. $m2 = new Matrix(array(array(4,5,6),array(78,15,12),array(87,1,54))); /* tablica tablic */
  14.  
  15. $m3 = new Matrix("[[457,21,4],[54,1,4],[14,2,2]]"); /* string jako json array */
  16.  
  17. $m4 = Matrix::fromString("[[12,24],[2,47]]")->scale(0);
  18.  
  19. $m5 = new Matrix;
  20. $m5 -> fromString("[[12,24],[2,47]]")->scale(0);
  21.  
  22. $m6 = new Matrix;
  23. $m6 -> import(array(1,2,3,4,5,4,42))->scale(0); /* metoda do importu z tablicy */
  24.  
  25. $m7 = new Matrix;
  26. $m7 -> import(array(array(4,5,6),array(78,15,12),array(87,1,54)))->scale(0);
  27.  
  28. $m8 = new Matrix(array(array(1,1,1),array(1,1))); /* błąd różne wymiary tablic wewnętrznych */
  29. /*Generowanie wyjątku:
  30.   MatrixException(4):
  31.   'Cannot initial Matrix from this data'
  32.   in line:
  33.   118
  34.   in file:
  35.   D:\Program Files (x86)\Zend\Apache2\htdocs\homepage\inc\resp\matrix\2.000\Matrix.class.php
  36.  
  37.   #0 D:\Program Files (x86)\Zend\Apache2\htdocs\homepage\inc\resp\matrix\2.000\Matrix.class.php(90): Matrix::_checkDimensions(Array)
  38.   #1 D:\Program Files (x86)\Zend\Apache2\htdocs\homepage\eval.php(47) : eval()'d code(5): Matrix->__construct(Array)
  39.   #2 D:\Program Files (x86)\Zend\Apache2\htdocs\homepage\eval.php(47): eval()
  40.   #3 {main}
  41. */
  42.  
  43. echo $m1->scale(0); // ustawanie skali. Jest ona przekazywana do obiektów pochodnych dzięki czemu podczas method chaining nie wraca na wartość domyślną
  44. /*
  45.   [ 1 2 3 4 5 4 42 ]
  46. */
  47. echo $m2->transpose()->scale(0);
  48. /*
  49.   [ 4 78 87 ]
  50.   [ 5 15 1 ]
  51.   [ 6 12 54 ]
  52. */
  53. echo $m3->cofactors();
  54. /*
  55.   [ -6.0000 -34.0000 80.0000 ]
  56.   [ -52.0000 858.0000 -1612.0000 ]
  57.   [ 94.0000 -620.0000 -677.0000 ]
  58. */
  59. echo $m4->det();
  60. /*
  61.   516
  62. */
  63. echo $m5->trace();
  64. /*
  65.   59
  66. */
  67. echo $m7->scale(2)->transpose()->scalar(125)->inverse();
  68. /*
  69.   1e-3 *
  70.   [ -0.32 1.27 0.49 ]
  71.   [ 0.11 0.12 -0.17 ]
  72.   [ 0.01 -0.17 0.13 ]
  73.  
  74.   # tutaj widać skalowanie wyników #
  75. */
  76.  
  77. }catch(MatrixException $e){
  78. echo $e;
  79. }
  80. ?>


#ADD
To moja pierwsza klasa obsługująca wyjątki więc prosiłbym o ocenę i ewentualne konstruktywne uwagi:)
by_ikar
Cytat
Nie znaleziono obiektu!

Nie znaleziono żądanego URLa na tym serwerze. Odnośnik na referującej stronie wydaje się być nieprawidłowy lub nieaktualny. Poinformuj autora tej strony o problemie.

Jeśli myślisz, że jest to błąd tego serwera, skontaktuj się z administratorem.

Error 404

student.agh.edu.pl
Sun Mar 18 21:57:12 2012
Apache/2.2.22 (Unix) mod_ssl/2.2.22 OpenSSL/0.9.8r
shinuexx
Cytat(shinuexx @ 18.03.2012, 16:24:07 ) *
[...]
Kolejna wersja klasy:
Matrix.class.php
[...]

:]
darko
Czy policzysz wyznacznik dla macierzy powyżej stopnia trzeciego? Chętnie zobaczyłbym implementację metody Gaussa :] Pewnie znasz to - można sprawdzić poprawność Twojej implementacji, na co niestety nie mam w tej chwili czasu: http://matrixcalc.org/en.index.html
shinuexx
Nie zaimplementowałem jeszcze algorytmu Gaussa (chociaż byłby pewnie optymalniejszy) ale mimo to liczy wyznaczniki macierzy stopnia wyższego jak 3 np:
  1. try{
  2. $m = new Matrix("[[1,54,85,14,54],[32,45,62,1,35],[46,5,54,456,54],[87,45,65,23,21],[68,45,6
    857,5,4]]"
    );
  3. echo $m->scale(0)->det().PHP_EOL;
  4. }catch(MatrixException $e){
  5. echo $e;
  6. }

Kod
9914109304

Prawdą jest że im wyższy stopień to czas liczenia się niemiłosiernie dłuży. Postaram się zaimplementować Gaussa(próby nie bardzo udane widać w aktualnej wersji). Dodałem wczoraj także Matrix::MatlabFormat() (oraz 3 inne) zwracający macierz w matlabowskiej formie.
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-2024 Invision Power Services, Inc.