Matlab - Max i min
w przestzreni 2D
% do funkcji nalezy przekazywac macierz [n][2] %tzn n-punktow w przestrzeni 2-wymiarowej %(no i oczywiscie n - czyli ich ilosc) function maximin(t,n); %t(:,:) %tablica gdzie benda przechowywane prototypy klas %(wspolrzendne i l.p. punktu) z=[n,3]; %tablica gdzie przechowywane sa %punkty nie bendonce prototypami p=[n,3]; %zeruje tablice z klasami for i=1:n for j=1:3 z(i,j)=0; end end
%wypelniam tablice punktów tablica t oraz kolumne 3 indexami for i=1:n p(i,1)=t(i,1); p(i,2)=t(i,2); p(i,3)=i; end disp(p) %disp(z) %pentla do szukania 2 pierwszych prototypów klas max=odleglosc(p(1,1),p(1,2),p(1,1),p(1,2)); for i=1:n-1 for j=i+1:n pom=odleglosc(p(i,1),p(i,2),p(j,1),p(j,2)); if pom > max max=pom; p1=i; p2=j; end end end %odleglosc(p(p1,1),p(p1,2),p(p2,1),p(p2,2)) z=klasa(z,p,p1,n); p=punkt(p,p1); z=klasa(z,p,p2,n); p=punkt(p,p2); disp(z); disp(p);
for i=3:n m=sprawdz(z,p,n); if m > 0 z=klasa(z,p,m,n); p=punkt(p,m); 'nastapila zmiana w tablicach prototypow oraz puktow oto one po zmianie ' disp(z) disp(p) end end % teraz zostala ustalona liczba klas a wiec mozna przyporzodkowac pukty do klas for i=1:n if p(i,3) > 0 pom=klasyfikator(z,p,i,n); i pom p(i,3)=pom; end end wypisz(z,p,n);
%liczy odleglosc miendzy dwoma punktami... function odleglosc=odleglosc(x1,y1,x2,y2); odleglosc=sqrt(((x2-x1)^2)+((y2-y1)^2));
%funkcja do liczenia sredniej odleglosci miendzy punktami klas (dzielonej na dwa) function srednia=srednia(z,n); %petla do sprawdzanie ile jest prototypow w tablicy z k=0; for i=1:n if z(i,3)~=0 k=k+1; end end suma=0; licznosc=0; for i=1:k-1 for j=i+1:k suma=suma+odleglosc(z(i,1),z(i,2),z(j,1),z(j,2)); licznosc=licznosc+1; end end srednia=suma/licznosc; srednia=srednia/2;
%funkcja od tego by wrzucic punkt do tablicy klas... function z=klasa(z,p,i,n); for k=1:n if z(k,3)==0 index=k; break; end end %teraz pod 'index' jest index pierwszego wolnego miejsca na klasie... z(index,1)=p(i,1); z(index,2)=p(i,2); z(index,3)=p(i,3);
%funkcja to tego by wyrzucic punkt z tablicy punktow %poprzez wstawienie w trzeciej kolumnie '0' czyli zera... function p=punkt(p,i); p(i,3)=0;
%funkcja majaca za zadanie sprawdzic czy nie trzeba dodac nowych klas %i jesli tak to wyrzuca index punktu który trzeba przerobic na klase function index=sprawdz(z,p,n); index=0; for k=1:n if z(k,3)==0 in=k; break; end end in=in-1; % pod 'in' jest index ostatniego zapelnionego miejsca w klasie sr=srednia(z,n); k=0; for i=1:n if p(i,3)~=0 min=odleglosc(p(i,1),p(i,2),z(1,1),z(1,2)); for j=2:in if odleglosc(p(i,1),p(i,2),z(j,1),z(j,2)) < min min=odleglosc(p(i,1),p(i,2),z(j,1),z(j,2)); end end if min > sr index=i; break; end end end
%funkcja oceniajaca do ktorej klasy nalezy dopisac dany punkt... function numer=klasyfikator(z,p,i,n); for k=1:n if z(k,3)==0 in=k; break; end end in=in-1; % pod 'in' jest index ostatniego zapelnionego miejsca w klasie min=odleglosc(p(i,1),p(i,2),z(1,1),z(1,2)); numer=1; for k=2:in if odleglosc(p(i,1),p(i,2),z(k,1),z(k,2)) < min min = odleglosc(p(i,1),p(i,2),z(k,1),z(k,2)); numer=k; end end
function wypisz(z,p,n); for k=1:n if z(k,3)==0 in=k; break; end end in=in-1; % pod 'in' jest index ostatniego zapelnionego miejsca w klasie czyli ilosc klas!!!!!!!!!!!! 'ilosc klas to : ' in 'klasa numer 1' for k=1:in z(k,1:2) for i=1:n if p(i,3) > 0 if p(i,3)==k p(i,1:2) end end end 'i nastepna klasa' end
2012.11.22 22:29:19.