Matlab - Max i min
w przestzreni 3D
% do funkcji nalezy przekazywac macierz [n][3] %tzn n-punktow w przestrzeni 3-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,4]; %tablica gdzie przechowywane sa punkty %nie bendonce prototypami p=[n,4]; %zeruje tablice z klasami for i=1:n for j=1:4 z(i,j)=0; end end
%wypelniam tablice punktów tablica t oraz kolumne 3 indexami for i=1:n for j=1:3 p(i,j)=t(i,j); end p(i,4)=i; end disp(p) %disp(z) %pentla do szukania 2 pierwszych prototypów klas max=odleglosc(p(1,1),p(1,2),p(1,3),p(1,1),p(1,2),p(1,3)); for i=1:n-1 for j=i+1:n pom=odleglosc(p(i,1),p(i,2),p(i,3),p(j,1),p(j,2),p(j,3)); if pom > max max=pom; p1=i; p2=j; end end end 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); p(i,3)=pom; end end wypisz(z,p,n);
%liczy odleglosc miendzy dwoma punktami... function odleglosc=odleglosc(x1,y1,z1,x2,y2,z2); odleglosc=sqrt(((x2-x1)^2)+((y2-y1)^2)+((z2-z2)^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 for i=1:n if z(i,4)==0 k=i; break; end end k=k-1; suma=0; licznosc=0; for i=1:k-1 for j=i+1:k suma=suma+odleglosc(z(i,1),z(i,2),z(i,3),z(j,1),z(j,2),z(j,3)); 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,4)==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); z(index,4)=p(i,4);
%funkcja to tego by wyrzucic punkt z tablicy punktow poprzez %wstawienie w trzeciej kolumnie '0' czyli zera... function p=punkt(p,i); p(i,4)=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,4)==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,4)~=0 min=odleglosc(p(i,1),p(i,2),p(i,3),z(1,1),z(1,2),z(1,3)); for j=2:in if odleglosc(p(i,1),p(i,2),p(i,3),z(j,1),z(j,2),z(j,3)) < min min=odleglosc(p(i,1),p(i,2),p(i,3),z(j,1),z(j,2),z(j,3)); 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,4)==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),p(i,3),z(1,1),z(1,2),z(1,3)); numer=1; for k=2:in if odleglosc(p(i,1),p(i,2),p(i,3),z(k,1),z(k,2),z(k,3)) < min min = odleglosc(p(i,1),p(i,2),p(i,3),z(k,1),z(k,2),z(k,3)); numer=k; end end
function wypisz(z,p,n); for k=1:n if z(k,4)==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:3) for i=1:n if p(i,4) > 0 if p(i,4)==k p(i,1:3) end end end 'i nastepna klasa' end %it.2taj.net
2012.11.22 22:29:19.