登录论坛

查看完整版本 : [MATLAB图像处理] 急求一个关于k-means聚类的循环问题


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文件中设置断点执行,也可以成功运行。
很奇怪,请高手指点。

silas_xue
2009-05-02, 04:34
lz 能否把locs矩阵贴出来 大家一起讨论一下

Dr.KenLo
2009-05-02, 22:04
locs是一个73*4的矩阵。
locs =

59.6500 148.2200 10.7700 -1.6350
56.0100 33.7200 9.9000 -1.3170
168.5900 56.9700 7.5800 2.6200
145.6200 96.1000 7.9300 1.2420
123.9800 71.8800 8.3300 2.9730
101.4700 89.5200 7.6900 -0.1550
174.9400 34.4300 5.5200 2.9270
169.7200 119.6700 6.2100 1.1970
52.0900 91.6400 5.9100 2.6710
52.0900 91.6400 5.9100 0.5390
180.6100 141.5800 5.2400 -0.1530
106.4900 109.4300 4.3700 0.0420
60.0600 77.5400 5.0500 0.3800
58.1200 163.9400 4.6600 1.1130
28.9400 61.3800 4.4000 0.8810
15.3100 142.4600 5.3900 1.9390
77.7100 164.8000 4.1300 -1.4670
57.8200 104.2800 4.2300 2.8490
35.2300 39.8200 3.8900 1.5500
28.8900 61.6200 4.4700 0.9310
18.3400 163.3700 4.1400 -2.7860
129.4300 62.2900 2.9400 2.9200
115.9200 125.8200 3.0600 0.1360
81.5800 60.5400 3.0200 2.9580
81.4100 149.8900 3.2200 -1.5620
60.5100 146.9000 3.1600 -0.5400
52.1200 123.2700 3.4800 2.3860
52.5100 19.6100 3.3700 2.1440
49.8500 57.4800 3.4100 0.7610
43.9500 63.2800 3.3300 0.7880
23.6800 71.6300 3.1800 0.7960
17.0900 55.2500 3.4300 1.1960
15.6900 26.8000 3.1500 1.5520
130.5800 113.9500 2.4300 -0.6200
122.8800 103.1400 2.6100 1.7590
122.1300 74.0600 2.8000 0.7020
117.5600 111.5400 2.7800 0.6140
115.3100 59.8000 2.3000 2.9600
109.4800 63.8700 2.3600 2.8980
73.5800 153.6300 2.5400 -1.4210
68.3900 125.3600 2.4600 0.8050
64.7100 57.2200 2.4600 2.5330
61.6900 129.5500 2.6700 -2.8840
59.9900 51.3900 2.5400 -0.2750
58.1900 45.0400 2.4100 -0.2830
45.8300 118.4700 2.6700 2.3560
43.3400 36.1100 2.5700 1.6070
114.5200 117.9700 2.0800 0.2500
73.3900 109.1600 1.8800 0.6260
67.6200 111.1800 1.9100 0.5290
67.6200 111.1800 1.9100 -0.2060
65.5500 69.4700 2.0900 -2.9760
61.2800 134.9500 1.9600 -2.8950
56.0700 26.5200 2.2000 -0.4790
56.0700 26.5200 2.2000 -2.8750
167.4900 89.7500 1.5700 -1.6140
166.8600 97.1500 1.6900 -1.5670
154.3900 90.4800 1.4600 1.4640
154.1700 84.3000 1.4200 1.4340
57.2600 30.7400 1.4200 -2.9230
180.2000 28.5300 1.3900 0.3240
167.2000 84.9800 1.4100 -1.5870
65.8500 115.9000 1.3000 -2.0740
63.8500 64.7900 1.2000 0.3950
59.6800 46.9000 1.2900 -0.2800
54.1500 50.3500 1.3400 -0.1550
8.9700 55.9800 1.2800 0.5340
61.2700 144.0600 0.8800 -2.6960
58.3700 140.4200 1.0800 -1.6400
57.4100 42.4800 0.9700 -2.6320
56.4100 134.5800 0.9800 2.9730
53.9000 53.7300 0.9000 -2.3420
51.8400 40.5000 0.9900 1.2630

该矩阵的意义是由我自己定义的。

silas_xue
2009-05-04, 06:10
lz 我把数据嵌到函数中 运行 是没有任何问题的
我观察了循环计数变量i 跳出时i为200
另外 我把数据从Command Window调入 也是没有问题的;
我使用的版本是R2007b

lz是直接调用这个函数么 还是函数嵌套 ?