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.