Dr.KenLo
2009-05-01, 21:22
原代码:
%初始化5个聚类中心,对经过处理的图像进行基于k-means聚类的子区域处理
function k=clusterpartition(locs)
ct=[50,50;140,50;90,120;50,170;130,170];%平均随机选取5个聚类中心
tic;
for i=1:200
dist1=sqrt((locs(:,1)-ct(1,1)).^2+(locs(:,2)-ct(1,2)).^2);
dist2=sqrt((locs(:,1)-ct(2,1)).^2+(locs(:,2)-ct(2,2)).^2);
dist3=sqrt((locs(:,1)-ct(3,1)).^2+(locs(:,2)-ct(3,2)).^2);
dist4=sqrt((locs(:,1)-ct(4,1)).^2+(locs(:,2)-ct(4,2)).^2);
dist5=sqrt((locs(:,1)-ct(5,1)).^2+(locs(:,2)-ct(5,2)).^2);
dt=[dist1,dist2,dist3,dist4,dist5];
[m,n]=min(dt');
newlocs=[locs,n'];
[r,c]=size(newlocs);
sub1=[];
sub2=[];
sub3=[];
sub4=[];
sub5=[];
for j=1:r
switch newlocs(j,5)
case 1
sub1=[sub1;newlocs(j,:)];
case 2
sub2=[sub2;newlocs(j,:)];
case 3
sub3=[sub3;newlocs(j,:)];
case 4
sub4=[sub4;newlocs(j,:)];
case 5
sub5=[sub5;newlocs(j,:)];
end
end
if size(sub1,1)>1
subm1=mean(sub1);
else
subm1=sub1;
end
if size(sub2,1)>1
subm2=mean(sub2);
else
subm2=sub2;
end
if size(sub3,1)>1
subm3=mean(sub3);
else
subm3=sub3;
end
if size(sub4,1)>1
subm4=mean(sub4);
else
subm4=sub4;
end
if size(sub5,1)>1
subm5=mean(sub5);
else
subm5=sub5;
end
ct=[subm1(1,1),subm1(1,2);subm2(1,1),subm2(1,2);subm3(1,1),subm3(1,2);subm4(1,1),subm4(1,2);subm5(1,1),subm5(1,2)];
end
dist1=sqrt((locs(:,1)-ct(1,1)).^2+(locs(:,2)-ct(1,2)).^2);
dist2=sqrt((locs(:,1)-ct(2,1)).^2+(locs(:,2)-ct(2,2)).^2);
dist3=sqrt((locs(:,1)-ct(3,1)).^2+(locs(:,2)-ct(3,2)).^2);
dist4=sqrt((locs(:,1)-ct(4,1)).^2+(locs(:,2)-ct(4,2)).^2);
dist5=sqrt((locs(:,1)-ct(5,1)).^2+(locs(:,2)-ct(5,2)).^2);
dt=[dist1,dist2,dist3,dist4,dist5];
[m,n]=min(dt');
k=[locs,n'];
toc;
说明:locs是一个求得的73X4矩阵
这段代码在m文件中编写,运行时循环只能执行一次,很奇怪。
我把代码直接复制到Command Windows里,程序成功运行。
我在m文件中设置断点执行,也可以成功运行。
很奇怪,请高手指点。
%初始化5个聚类中心,对经过处理的图像进行基于k-means聚类的子区域处理
function k=clusterpartition(locs)
ct=[50,50;140,50;90,120;50,170;130,170];%平均随机选取5个聚类中心
tic;
for i=1:200
dist1=sqrt((locs(:,1)-ct(1,1)).^2+(locs(:,2)-ct(1,2)).^2);
dist2=sqrt((locs(:,1)-ct(2,1)).^2+(locs(:,2)-ct(2,2)).^2);
dist3=sqrt((locs(:,1)-ct(3,1)).^2+(locs(:,2)-ct(3,2)).^2);
dist4=sqrt((locs(:,1)-ct(4,1)).^2+(locs(:,2)-ct(4,2)).^2);
dist5=sqrt((locs(:,1)-ct(5,1)).^2+(locs(:,2)-ct(5,2)).^2);
dt=[dist1,dist2,dist3,dist4,dist5];
[m,n]=min(dt');
newlocs=[locs,n'];
[r,c]=size(newlocs);
sub1=[];
sub2=[];
sub3=[];
sub4=[];
sub5=[];
for j=1:r
switch newlocs(j,5)
case 1
sub1=[sub1;newlocs(j,:)];
case 2
sub2=[sub2;newlocs(j,:)];
case 3
sub3=[sub3;newlocs(j,:)];
case 4
sub4=[sub4;newlocs(j,:)];
case 5
sub5=[sub5;newlocs(j,:)];
end
end
if size(sub1,1)>1
subm1=mean(sub1);
else
subm1=sub1;
end
if size(sub2,1)>1
subm2=mean(sub2);
else
subm2=sub2;
end
if size(sub3,1)>1
subm3=mean(sub3);
else
subm3=sub3;
end
if size(sub4,1)>1
subm4=mean(sub4);
else
subm4=sub4;
end
if size(sub5,1)>1
subm5=mean(sub5);
else
subm5=sub5;
end
ct=[subm1(1,1),subm1(1,2);subm2(1,1),subm2(1,2);subm3(1,1),subm3(1,2);subm4(1,1),subm4(1,2);subm5(1,1),subm5(1,2)];
end
dist1=sqrt((locs(:,1)-ct(1,1)).^2+(locs(:,2)-ct(1,2)).^2);
dist2=sqrt((locs(:,1)-ct(2,1)).^2+(locs(:,2)-ct(2,2)).^2);
dist3=sqrt((locs(:,1)-ct(3,1)).^2+(locs(:,2)-ct(3,2)).^2);
dist4=sqrt((locs(:,1)-ct(4,1)).^2+(locs(:,2)-ct(4,2)).^2);
dist5=sqrt((locs(:,1)-ct(5,1)).^2+(locs(:,2)-ct(5,2)).^2);
dt=[dist1,dist2,dist3,dist4,dist5];
[m,n]=min(dt');
k=[locs,n'];
toc;
说明:locs是一个求得的73X4矩阵
这段代码在m文件中编写,运行时循环只能执行一次,很奇怪。
我把代码直接复制到Command Windows里,程序成功运行。
我在m文件中设置断点执行,也可以成功运行。
很奇怪,请高手指点。