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.