Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> tablice?
chomiczek
post
Post #1





Grupa: Zarejestrowani
Postów: 271
Pomógł: 4
Dołączył: 5.01.2005

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


Słuchajcie potrzebuje zrobić np. taką tablicę, która będzie wyglądała tak:
0 1 0 0 1
1 0 1 1 0
0 1 1 0 0
0 1 0 0 1
0 0 0 0 1

ogólnie wielkość tablicy nie ma znaczenia, ale najważniejsze co chce osiągnąć to to, żeby zliczyć sumę elementów zarówno w pionie jak i w poziomie.

Czyli w tym przypadku powinienem otrzymać np 2 tablice - pion [1,3,2,1,3], poziom [2,3,2,2,1]

o ile to jest jeszcze połową sukcesu to później chce na podstawie tablic pion i poziom zobaczyć co miałem tam wcześniej, może tam być np. jakiś znak, chce to zastosować w OCR..

ktoś ma jakiś pomysł jak powinien wyglądać algorytm sprawdzający sumę poszczególnych linii?

a może jest dostępne gdzieś takie rozwiązanie??

edt: oczywiście pierwsza część czyli stworzenie tablicy pion i poziom jest banalne, bo wystarczy foreach i zliczyć, ale chodzi bardziej o odczytanie tablic pion i poziom i zbudowanie na ich podstawie jednej tablicy

Ten post edytował chomiczek 5.04.2010, 14:31:15


--------------------
created by chomiczek
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Funkcje array_combine i/lub array_merge powinny być pomocne.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Pilsener
post
Post #3





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat
2 tablice - pion [1,3,2,1,3], poziom [2,3,2,2,1]
- nic prostszego, parsujesz tablicę pętlą foreach:
  1. foreach ($tablica as $tablica2){
  2. ++$licz1;
  3. foreach($tablica2 as $value){
  4. ++$licz2;
  5. echo $licz1.'|'.$licz2.'|'.$value.'<br />';
  6. }
  7. }
- pozostaje policzyć lub wprowadzić ręcznie rozmiar tablicy i w zależności od stanu liczników dodać zmienną $value do odpowiedniego indeksu nowych tablic pion i poziom.
Go to the top of the page
+Quote Post
chomiczek
post
Post #4





Grupa: Zarejestrowani
Postów: 271
Pomógł: 4
Dołączył: 5.01.2005

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


@Pilsener hmm.. jakoś mi ten kod Twój nie działa..
mam wątpliwości odnośnie linii 3, skoro w 1 linijce masz:
  1. as $tablica2


poza tym tak jak pisałem utworzenie tablic pion i poziom nie jest wielkim problem.. kwestia jak z tych dwóch tablic utworzyć tablicę źródłową.

Co do tego co pisze darko to też chyba nie do końca pomocne.. ewentualnie w jaki sposób zrobić odwzorowanie płaskiej tablicy w 2 wymiarach i porównać sumy X z Y??

teoretycznie tablice można by zapisać jako:
  1. $pion = array(1,3,2,1,3);
  2. $poziom = array(2,3,2,2,1);
  3.  
  4. //a potem zapisać to tak
  5. $nowyPion = array();
  6. $nowyPion[] = '1,0,0,0,0';
  7. $nowyPion[] = '1,1,1,0,0';
  8. $nowyPion[] = '1,1,0,0,0';
  9. $nowyPion[] = '1,0,0,0,0';
  10. $nowyPion[] = '1,1,1,0,0';
  11.  
  12. $nowyPoziom = array();
  13. $nowyPoziom[] = '1,1,0,0,0';
  14. $nowyPoziom[] = '1,1,1,0,0';
  15. $nowyPoziom[] = '1,1,0,0,0';
  16. $nowyPoziom[] = '1,1,0,0,0';
  17. $nowyPoziom[] = '1,0,0,0,0';
  18.  


tylko co mi to tak naprawdę da.. tutaj rozpisałem wszystkie wartości o lewej, ale równie dobrze można by je dać od prawej.. z przecięcia takich tablic nie dostanę tego co bym chciał..

Ten post edytował chomiczek 5.04.2010, 19:03:03


--------------------
created by chomiczek
Go to the top of the page
+Quote Post
flashdev
post
Post #5





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


Cytat(chomiczek @ 5.04.2010, 20:01:41 ) *
[...]
poza tym tak jak pisałem utworzenie tablic pion i poziom nie jest wielkim problem.. kwestia jak z tych dwóch tablic utworzyć tablicę źródłową.
[...]


Pytasz o to z taką pewnością, jak byś wiedział, że jest to możliwe do wykonania, a czy sprawdziłeś?

Otóż nie jest. Zamieniając główną tablicę na dwie mniejsze tracisz część informacji. Nie zawsze musi dać się w jednoznaczny sposób odwrócić tą operację.

Przykład:

mamy tablicę (1*)
1 0 0
0 1 0
0 0 1

obliczmy:
- pion: 1 1 1
- poziom: 1 1 1

I te dane owszem pasują do tablicy 1*, ale pasują również do tablicy 2*.

tablica 2*:
0 0 1
0 1 0
1 0 0


--------------------
Go to the top of the page
+Quote Post
toel
post
Post #6





Grupa: Zarejestrowani
Postów: 97
Pomógł: 11
Dołączył: 2.02.2010

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


Tak jak flashdev napisał jest to nie możliwe do realizacji w taki sposób jak być to chciał osiągnąć.

Jednak jeśli koniecznie potrzebujesz zrobić skrót tej tablicy polecam skorzystanie z "odwróconej dwójkowości" (nazwę właśnie wymyśliłem na potrzeby odpowiedzi ;P )


Czyli stosujemy system dwójkowy tyle, że zamiast od prawej, liczymy od lewej (jedyny sens zastosowania odwrotności jest taki, że wg mnie prościej wtedy się operuje na tablicach 2D o nieznanym wymiarze)


Czyli biorąc tą tablicę:

0 1 0 0 1
1 0 1 1 0
0 1 1 0 0
0 1 0 0 1
0 0 0 0 1

Zapis byłby następujący (jeśli się nie pomyliłem) dla wierszy

17
13
6
18
16

I to starczy bo właściwie kolumny odtworzą Ci się same z siebie, więc nie ma sensu robić zliczania kolumnowego...


[edit]

Nie sprawdzałem tego kodu ale powinno zadziałać (tab to twoja tabliza 01)
  1. $new_arr=array();
  2.  
  3. for($i=0;$i<sizeof($tab);$i++)
  4. {
  5. $bin=1;
  6.  
  7. $cnt=0;
  8.  
  9. for($j=0;$j<sizeof($tab[$i]);$j++)
  10. {
  11. $cnt=$cnt+($tab[$i][$j]*$bin);
  12.  
  13. $bin=$bin*2;
  14. }
  15.  
  16. $new_arr[]=$cnt;
  17. }



Ten post edytował toel 9.04.2010, 15:32:29
Go to the top of the page
+Quote Post
Psychopath
post
Post #7





Grupa: Zarejestrowani
Postów: 16
Pomógł: 2
Dołączył: 22.01.2006

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


Hmm, troszkę się pomęczyłem i nie wiem jaki jest powód, ale działa dobrze do momentu.

  1. <?php
  2. $cyfry = array(
  3. array(0,1,0,0,1),
  4. array(1,0,1,1,0),
  5. array(0,1,1,0,0),
  6. array(0,1,0,0,1),
  7. array(0,0,0,0,1)
  8. );
  9.  
  10. // Poziomo
  11. foreach($cyfry as $linia){
  12. $suma1 = array_sum($linia);
  13. $suma["poziomo"][$numer] = $suma1;
  14. $numer = $numer+1;
  15. echo "Suma pozioma tablicy numer $numer to $suma1<br />";
  16. }
  17. echo "<hr />";
  18.  
  19. // Pionowo
  20. $ilosc_elementow_pn = count($cyfry);
  21. $ilosc_elementow_pz = count($cyfry[0]); //Dla jednakowej ilości elementów w każdym array'u
  22.  
  23.  
  24. $a = 0;
  25. $sumax = 0;
  26. $x = 0;
  27.  
  28. while($x <= $ilosc_elementow_pz){
  29. while($a <= $ilosc_elementow_pn){
  30. $sumax = $sumax + $cyfry[$a][$x];
  31. $a = $a+1;
  32. if($a == $ilosc_elementow_pn){
  33. $suma["poziomo"][$x] = $sumax;
  34. $sumax = 0;
  35. echo "Suma pionowa tablicy numer $x to ".$suma["pionowo"][$x]."<br />";
  36.  
  37. }
  38. }
  39. $a = 0;
  40. $x = $x+1;
  41. }
  42. ?>


Wszystko powinno być ok jak na to patrzę, ale coś nie gra, przynajmniej na localhoscie. Poziomo oblicza normalnie, pionowo już nie do końca. To pewnie wina zmęczenia, kodzę od jakichś 16 godzin z przerwą na obiad:P

EDIT: Napisałem, i 10 sekund później znalazłem buga, już poprawione:)

Ten post edytował Psychopath 11.04.2010, 04:52:58
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 Aktualny czas: 19.08.2025 - 06:47