[ gogi100 @ 18.01.2014. 09:15 ] @
Imam matricu 9x9 od realnih brojeva. Treba naci duplikate iznad glavne dijagonale i odstampati ih. Ako je moguce uraditi u nekom od programskih jezika ili u matlabu
[ tuolarips @ 18.01.2014. 10:45 ] @
Imas li predlog resenja? :)
[ gogi100 @ 18.01.2014. 13:57 ] @
Ne znam kako da izvrsim proveru duplikata, postoji komanda?
[ gogi100 @ 18.01.2014. 21:34 ] @
evo koda koji sam zapoceo ali ne znam sve delove. radjen je u matlabu
Code:
  
for i=1:9  
for j=1:9
    disp('Unesi elemente matrice C9x9:')
    C(i,j)=input('');
    end
end
for i=1:9
for j=1:9
 if (i<j)
%┬átreba mi kod koji pretrazuje da li postoje duplikati iznad glavne dijagonale i prikazuje mi prvi koji je pronadjen, i prekida dalju pretragu. 
 %takodje mi treba i kod koji prikazuje sve duplikate
 
 else
%┬ánema takvih elemenata
disp('Nema takvih elemenata')
fprintf('Matrica je', C)
 end
end
end
[ tuolarips @ 19.01.2014. 10:35 ] @
Code:

disp('Unesi elemente matrice C9x9:')
for i=1:9  
    for j=1:9
        C(i,j)=input('');
    end
end

hashSet = java.util.HashSet;
duplicate = 0;
hasDuplicate = false;
for i=1:9
    for j=(i+1):9
        currentElement = C(i,j);
        if hashSet.contains(currentElement)
            hasDuplicate = true;
            duplicate = currentElement;
            break;
        end
        hashSet.put(currentElement);
    end
    
    if hasDuplicate
        break;
    end
end

if hasDuplicate
    fprintf('Pronadjen je duplikat: %d', duplicate);
else
    fprintf('Duplikati iznad glavne dijagonale nisu pronadjeni');
end


Ovo je jedno od resenja zadatka. Pre svega, primeti da unutrasnja petlja ide od i+1 do 9. Razlog za to je sto elementi glavne dijagonale imaju tu osobinu da su im indeksi i i j jednaki. Tako da za dato i (prva for petlja) znamo da je indeks j elementa glavne dijagonale j=i. S obzirom da je potrebno da radis nad elementima iznad glavne dijagonale, petlja ide od tog elementa ka "desno", iliti od i+1 do 9 (ako ti i dalje nije jasno zasto tako ide, najbolje nacrtaj sebi matricu, i idi korak po korak kroz petlje).

Druga stvar koja je bitna je hashSet. To je struktura za koju se moze reci da odgovara pojmu matematickog skupa. Redosled elemenata u njoj nije bitan, i ne moze sadrzati dva ista elementa. Vrlo brzo izvrsava operaciju "contains" zbog nacina na koji je implementirana (o tome govori ono "hash" u njenom nazivu). U svakom slucaju, za tvoj zadatak je vrlo zgodno iskoristi je. Naime, stavljaces sve elemente iznad glavne dijagonale u ovu strukturu, i za svaki novi element ces proveriti da li on vec postoji u hashSet-u. Ukoliko vec postoji, to znaci da si naisao na duplikat, oznacis hasDuplicate na true, a u duplicate sacuvas o kom broju se radi. "break" ce ti izaci iz ugnjezdene petlje, ono drugo "break" iz spoljasnje petlje, i odstampace ti se odgovarajuca poruka.

Dakle, ovo je verzija koja prekida pretragu cim naidje na prvi duplikat. Drugu verziju bi bilo dobro da sam odradis ugledajuci se na ovaj kod. Pokusaj, postavi svoje resenje ovde, pa ako zapne, pomoci cu ti. Napomenula bih jos samo da Matlab nikad nisam ozbiljnije koristila, kod sam kucala napamet, pa proveri sintaksu.
[ gogi100 @ 19.01.2014. 11:24 ] @
koja bi komanda u matlabu bila ekvivalentna java.util.HashSet
[ tuolarips @ 19.01.2014. 12:02 ] @
To sam i pronasla ovde.

PS Izgleda da Contains ipak ne vraca boolean vec 1 ili 0 u zavisnosti od toga da li hashset sadrzi dati element ili ne. Pa ispravi kod u skladu s tim.
[ gogi100 @ 19.01.2014. 16:35 ] @
nasao sam neki kod ali mi ne odradjuje bas kako ocekujem
Code:

A = [1 2 2 9; 4 5 1 8; 3 1 1 1; 5.3 5 1.8 7]
A_unique = unique(tril(A, -1))
FLAG = false;
for ii = 1:length(A(1,:))
   for jj = ii+1:length(A(1,:))
      if (length(A_unique) == length(unique([A_unique; A(ii,jj)])))
         
          display(A(ii,jj))
          FLAG = true;
          break;
      end
   end
   if FLAG
      break;
   end
end


ocekujem da mi prvi duplikat koji nadje iznad glavne dijagonale bude 2, a on nalazi 1
zasto?
[ gogi100 @ 19.01.2014. 16:54 ] @
ne dobijam resenje koje trazim. dobija se kao na slici. isto ovde se elementi iznad glavne dijagonale porede sa svim elementima u matrici. sta treba uraditi da bi se poredili samo u okviru iznad glavne dijagonael. kako u pricu uvesti irealne brojeve?
hvala
[ gogi100 @ 20.01.2014. 10:36 ] @
imam ovaj kod koji radi posao onako kako hocu ali ga ne razumem. mozete li mi dati bar neko objasnjenje
Code:

A  = [1 3.2 2 5; 4 9 5 8; 1 9 3 6; 5 3 2 1]
B=A;
      B(tril(B)>0)=nan;
      C=B(~isnan(B));
      [a,b] = unique(C,'first');
      [~,ii] = sort(b);
      c = histc(C,a);
      out0 = [a(ii),c(ii)];
      out = out0(find(out0(:,2)>1,1,'first'),1)
      if isempty(out)
          disp('no duplicates')
      end
[ tuolarips @ 22.01.2014. 19:32 ] @
Citat:
gogi100:
nasao sam neki kod ali mi ne odradjuje bas kako ocekujem
Code:

A = [1 2 2 9; 4 5 1 8; 3 1 1 1; 5.3 5 1.8 7]
A_unique = unique(tril(A, -1))
FLAG = false;
for ii = 1:length(A(1,:))
   for jj = ii+1:length(A(1,:))
      if (length(A_unique) == length(unique([A_unique; A(ii,jj)])))
         
          display(A(ii,jj))
          FLAG = true;
          break;
      end
   end
   if FLAG
      break;
   end
end


ocekujem da mi prvi duplikat koji nadje iznad glavne dijagonale bude 2, a on nalazi 1
zasto?


Pojasnicu ti sta radi kod kog si nasao, a onda i zasto nalazi 1.

Pre svega funkcija tril u datoj matrici ocuva vrednosti koje se nalaze na i ispod dijagonale koja je zadata drugim parametrom. Sve ostale vrednosti u prosledjenoj matrici anulira. Da napomenem, ako prosledis 0 radi se o glavnoj dijagonali, ako prosledis -1 radi se o dijagonali odmah ispod glavne, 1 je za dijagonalu odmah iznad glavne, itd. Da bi ti bilo jasnije, posle ove funkcije, tvoja matrica A ce izgledati ovako:

0 0 0 0
4 0 0 0
3 1 0 0
5.3 5 1.8 0

unique ima za cilj da prodje kroz prosledjeni niz/matricu, i da izbaci sve duplikate. Nakon sto si funkciji unique prosledio matricu koju sam ti navela iznad, u A_unique ces dobiti niz od sledecih elemenata: 0, 4, 3, 1, 5.3, 5, 1.8.

One dve ugnjezdene petlje ce ti proci kroz gornji "deo" matrice. Ideja je da se za svaki taj element uradi unija sa nizom A_unique, nakon cega se ponovo poziva unique funkcija nad pomenutom unijom. Ukoliko novi element nije bio u nizu A_unique, nakon ponovne primene unique funkcije duzina novodobijenog niza ce biti za jedan veca od duzine niza A_unique. U suprotnom, ukoliko je element duplikat on ce se nakon ponovne primene unique funkcije izbaciti (jer unique funkcija izbacuje duplikate), te ce duzina novodobijenog niza biti ista kao duzina niza A_unique, i to ce znaciti da smo naisli na duplikat. (to ti upravo govori ovaj uslov: if (length(A_unique) == length(unique([A_unique; A(ii,jj)])))).

Hajdemo sad korak po korak, da bi shvatio zasto ti nalazi 1. Rekoh da ove dve ugnjezdene petlje iteriraju kroz elemente iznad glavne dijagonale matrice, i isto tako smo zakljucili da A_unique niz u sebi ima elemente 0, 4, 3, 1, 5.3, 5, 1.8. Element prve iteracije petlji je 2. 2 se ne nalazi u nizu A_unique, pa idemo dalje. Sledeci element je takodje 2. Opet vazi kao i malopre, jer se 2 ne nalazi u A_unique. Sledeci je 9, za kog opet vazi isto. Nakon toga dolazi 1 - jedinica se nalazi u A_unique, i on shvata da je naisao na duplikat.

Dakle, mozes da zakljucis da tvoj program nalazi element iz "gornjeg" dela matrice koji se istovremeno nalazi u "donjem" delu matrice.

EDIT: Izmenila sam poslednji deo poruke koji je nosio skroz pogresan zakljucak. Ovo iznad i dalje stoji, te sam to ostavila.

[Ovu poruku je menjao tuolarips dana 22.01.2014. u 22:57 GMT+1]