Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Prosirivanje i smanjivanje matrice operatorom--

[es] :: C/C++ programiranje :: C/C++ za početnike :: Prosirivanje i smanjivanje matrice operatorom--

[ Pregleda: 2147 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Prosirivanje i smanjivanje matrice operatorom--25.12.2009. u 15:41 - pre 174 meseci
Dakle, imam problem "skracivanju" binarne matrice ovim operatorom-- [prefiksnim] (mislim da mi sama upotreba operatora nije problem, vec ne mogu da pustim petlju tako da ovo radi za svaki uopsteni slucaj). Dakle, na primer matricu 4x4 ( i recimo velicine podsegmenta 2x2)
1 0 0 0
1 1 1 0 bi trebalo da smanjim na ovo - 1 0
1 0 0 1 ----------------------- ----- 0 1
0 0 1 1
. Proverava se da li je u podsegmentu veci broj nula ili jedinica i na osnovu toga se bira kojim brojem ce se zameniti. Posto mi je operator deklarisan ovako
[KompresovanaSlika operator--() ] mislim da mogu da rezultat da smestim u drugu matricu i nju da istampam. Kao sto rekoh, potrebna mi je pomoc pri ogranicavanju petlji tako da se svaki podsegment izdvoji na nacin opisan na ove dve gornje matrice. Hvala.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--25.12.2009. u 15:55 - pre 174 meseci
Ovo je meni nerazumljivo. Šta je ulaz, šta je izlaz, šta treba da se desi između ulaza i izlaza? Navedi primer ulaza i izlaza.

... Okej, ulaz je matrica 4x4 i veličina podsegmenta. Izlaz je matrica takva da svaki element matrice predstavlja jedan podsegment u originalnoj matrici. To ne može da se uradi s unarnim operatorom jer nemaš način da navedeš dimenzije podsegmenata. Pošto nemaš taj podatak onda ne možeš ni da utvrdiš podsegmente u početnoj matrici.
 
Odgovor na temu

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--25.12.2009. u 16:03 - pre 174 meseci
da,znam da je malo konfuzno.
Iskopiracu ceo tekst zadatka, mozda ti bude malo jasnije sta treba da se uradi.
Code:

Zadatak 5. U klasi Image, kreiranoj u prvoj vežbi, funkcije:
•    destruktor i
•    invert (funkciju za invertovanje slike),
definisati kao virtuelne.
Kreirati i klasu KompresovanaSlika, javno izvedenu iz klase Image, koja pamti veličinu segmenta koji se zamenjuje jednim bitom, i u njoj javne funkcije:
•    default konstruktor koji postavlja dimenziju matrice na 0,
•    konstruktor za postavljanje veličine matrice i veličinu posegmenata,
•    virtuelni destruktor,
•    konstruktor za kopiranje,
•    invert funkciju koja vrši transponovanje slike (predefiniše invert funkciju osnovne klase),
•    operatorsku funkciju -- koja vrši kompresovanje slike tako što se podsegmenti zadate veličine zadate dimenzije zamenjuju jednim bitom (čija je vrednost jednaka onoj vrednosti koja se više puta javlja u posmatranom podsegmentu),
•    operatorsku funkciju ++ koja vrši dekompresuje sliku tako što svaki bit zamenjuje podsegmentom date veličine popunjenim istom vrednošću.
U funkciji main kreirati statički objekat klase KompresovanaSlika, pokazivač tipa Image i dodeliti mu adresu objekta klase KompresovanaSlika kreiranog u dinamičkoj zoni memorije. Za oba objekta pozvati sve moguće funkcije.

 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--25.12.2009. u 16:43 - pre 174 meseci
Aha, pamti se u klasi. Znači imaš promenljive, recimo, KompresovanaSlika::podsegmentX i KompresovanaSlika::podsegmetY. U funkciji operator-- imaš četvorostruku petlju u kojoj spoljne dve petlje idu po podsegmentima, for (int segY = 0; segY * podsegmentY < sizeY; ++segY), a unutrašnje dve idu u sam podsegment, for (int i = 0; i < podsegmentY; ++i). Ove dve unutrašnje petlje broje koliko kojih elemenata ima (a gleda se koordinata [segY * podsegmentY + i][...]). Kad se završe dve unutrašnje petlje onda moraš da utvrdiš kojih elemenata ima najviše i u novoj matrici na mestu [segY][segX] da dodeliš tu vrednost.
 
Odgovor na temu

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--25.12.2009. u 18:11 - pre 174 meseci
Ocigledno nesto nisam skontao kako treba, jer mi program crashuje kad treba da uradi --matrica. Evo koda koji sam kucao (i kako sam shvatio promenljive):
b1,b0 - brojaci za broj 0 tj 1
a,b - to je valjda segy,segx u petljama, tj mesta na kojima se upisuju nule ili jedinice u smanjenoj matrici
i,j - brojaci koji idu kroz podsegment
ps- dimenzija segmenta, u mom slucaju 2 pa je velicina 2 x2;
n1- dimenzija matrice, u mom slucaju 4 pa je velicina 4x4;
kmat mi je element matrice.
Code:

KompresovanaSlika KompresovanaSlika::operator--()
    {
        int b1,b0;
    b1=0;
    b0=0;
    {
        for (int a =0; a*ps<n1;++a)
        {
            for (int b=0; b*ps<n1;++a)
            {
                for (int i=0; i<ps;++i)
                {
                    for (int j=0; j<ps;++j)
                    {
                        if (kmat[a*ps +i][b*ps+j]!=1)
                            b0=b0+1;
                        else
                            b1=b1+1;
                    }
                }
                 if (b1>b0)
                     kmat[a][b]=1;
                 else
                     kmat[a][b]=0;
            }
        }

        return *this;
    }
    }

Pokusao sam i da uvedem novu matricu i da njoj dodelim kmat parametar ali se isto desava.
Ovo je linija koda gde mi debuger izbaci gresku:
Code:

if (kmat[a*ps +i][b*ps+j]!=1)
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--25.12.2009. u 23:34 - pre 174 meseci
Prva stvar, u drugoj petlji treba ++b umesto ++a. Druga stvar, ne bi trebalo da direktno menjaš sadržaj matrice dok još čitaš podatke iz nje. Iako u tvom slučaju slučajno nemaš problem, ipak je bolje da napraviš privremeno novu matricu i nju popunjavaš, pa onda samo prepišeš podatke. I treće, ne zaboravi da na kraju promeniš i dimenzije matrice (n1).
 
Odgovor na temu

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--26.12.2009. u 11:48 - pre 174 meseci
Evo uradio sam ovako, i radi. Ne uspevam da uradim kada unesem novu matricu, (ukratko.. ubacim dole nova.kmat[a] [b ]=... i stavim return nova). tad mi i dalje stampa staru, ali bitno je da radi i ovako. Hvala puno!
Code:
KompresovanaSlika KompresovanaSlika::operator--()
    {

    int b1,b0;
    b1=0;
    b0=0;
    
        for (int a =0; a*ps<n1;++a)
        {
            for (int b=0; b*ps<n1;++b)
            {
                for (int i=0; i<ps;++i)
                {
                    for (int j=0; j<ps;++j)
                    {
                        if (kmat[a*ps +i][b*ps+j]!=1)
                            b0=b0+1;
                        else
                            b1=b1+1;
                    }
                }
                 if (b1>b0)
                    kmat[a][b]=1;
                 else
                    kmat[a][b]=0;
            b0=0;
            b1=0;
            }
        }
        n1=n1/ps;
        return *this;

 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--26.12.2009. u 11:54 - pre 174 meseci
Razlog zašto return nova ne uspeva je jer nisi izmenio sadržaj matrice. Operator-- treba da menja sadržaj "this" matrice. U ovom slučaju eto ne moraš time da se baviš, ali ako ikad budeš morao onda to radiš tako što iskopiraš sadržaj te privremene lokalne matrice u "this" matricu, i onda vratiš *this kao i obično.
 
Odgovor na temu

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--07.01.2010. u 16:15 - pre 174 meseci
uzeo sam ponovo ovo da radim, i sad imam problem sa prosirivanjem :(. Opet je u pitanju kvadratna, i u donjem primeru matrica je 2x2, kao i dimenzija podsegmenta(u koji se sada prosiruje - obojio sam prve dve cifre i segmente koji nastaju od njih cisto da se stekne utisak kako to treba da izgleda)
od : 10treba da se napravi 1 1 0 0
-----01-------------------1 1 0 0
---------------------------0 0 1 1
---------------------------0 0 1 1


Code:

int    k=n1*ps;
        KompresovanaSlika nova(k);
        
        for (int i=0; i<n1; i++)
        {
            for (int j=0; j<n1; j++)
            {
                
                if (kmat[i][j] == 1)

Dakle krenuo sam nesto ovako, gde posle if treba da smestim prvi element male matrice u segment velike. Pokusao sam da pustim iste 4 petlje kao i za kompresiju, ali je problem sto ne mogu da izadjem nakon sredjivanja prvog podsegmenta da bi proverio sledeci element male matrice, vec on nastavlja da ispunjuje celu (i izmedju ostalog izbacuje gresku). Neka ideja je da se ubaci brojac koji ce da izadje iz petlje nakon popunjavanja prvog segmenta, ali mi ne ide u glavu kako posle da nastavim tako odakle je stalo popunjavanje.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--07.01.2010. u 21:12 - pre 174 meseci
Kako da pronađemo grešku u kodu koji ne vidimo? Stavi kompletan kod, i način na koji se greška ispoljava. Inače, dve unutrašnje petlje treba da idu od nule do ps, i treba da popunjavaju segment nova.kmat[i*ps+ii][j*ps+jj] = kmat[i ][j], gde su ii i jj brojači dve unutrašnje petlje. Ne treba ti if.
 
Odgovor na temu

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--08.01.2010. u 13:07 - pre 173 meseci
ok, evo celog koda :)
Code:

KompresovanaSlika KompresovanaSlika::operator++()
    {
  int    k=n1*ps;
    KompresovanaSlika nova(k);
        for (int i=0; i<n1; i++)
        {
            for (int j=0; j<n1; j++)
            {
                for (int a=0; a<ps; a++)
                {
                    for (int b=0;b<ps; b++)
                    {
                        nova.kmat[i*ps+a][j*ps+b]=kmat[i][j];
                    }
                }
            }
        }
        n1=k;
        for (int i=0;i<n1;i++)
            for(int j=0;j<n1;j++)
                this->kmat[i][j]=nova.kmat[i][j];
        return *this;

    }

A evo i greske (pri debugiranju je izbaci ovde
Code:
this->kmat[i][j]=nova.kmat[i ][j]
) : Unhandled exception at 0x00415e2d in LabVezba1.exe: 0xC0000005: Access violation writing location 0xfdfdfdfd.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--08.01.2010. u 14:13 - pre 173 meseci
Program puca zato što trenutna matrica (this->kmat) nije dovoljno velika da primi nove podatke (nova.kmat). Moraš trenutnu matricu da zameniš većom. Zavisno od toga kako ti je organizovana klasa (tj. kog je tipa kmat) mogao bi prosto da preneseš kmat sa nova na this, i da resetuješ nova.kmat = NULL.
 
Odgovor na temu

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--08.01.2010. u 15:02 - pre 173 meseci
Da li mozes da napises kako to treba da izgleda, ili da pojasnis jos malo? pregledao sam sve slajdove sto imam ali nigde ne mogu da nadjem slican primer, sve sto smo mi radili je podrazumevalo da su po defaultu matrice istih dimenzija.
 
Odgovor na temu

nesha_
student

Član broj: 227061
Poruke: 21
*.dynamic.sbb.rs.



Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--08.01.2010. u 15:08 - pre 173 meseci
Zapravo, uspeo sam da uradim.
Code:


    for (int i=0; i<n1; i++)
        { 
            delete [] kmat[i];
        }
    delete [] kmat;
    n1=k;
    Napravi(n1);
            for (int i=0; i<n1; i++)
        {
            for (int j=0; j<n1; j++)
            {
                this->kmat[i][j]=nova.kmat[i][j];
            }
        }
        return *this;

Prvo sam obrisao staru matricu, pa sam napravio novu sa novim dimenzijama i radi. Da li postoji neko bolje resenje?
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Prosirivanje i smanjivanje matrice operatorom--11.01.2010. u 09:17 - pre 173 meseci
To je otprilike to. Manje prefinjeno rešenje bi bilo da uvek imaš matricu maksimalnih dimenzija, a koristiš samo deo koji ti treba. Unapređenje gornjeg rešenja je da ne radiš brisanje uvek nego samo kad moraš (kad je neka dimenzija veća od postojeće).
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: Prosirivanje i smanjivanje matrice operatorom--

[ Pregleda: 2147 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.