请matlab高手帮忙分析一下这个程序。详细解释每一步什么意思!答案满意加分!

w1=[0.1 6.8 -3.5 2.0 4.1 3.1 -0.8 0.9 5.0 3.9; 1.1 7.1 -4.1 2.7 2.8 5.0 -1.3 1.2 6.4 4.0];
w2=[7.1 -1.4 4.5 6.3 4.2 1.4 2.4 2.5 8.4 4.1;4.2 -4.3 0.0 1.6 1.9 -3.2 -4.0 -6.1 3.7 -2.2];
ww1=[ones(1,size(w1,2)); w1];
ww2=[ones(1,size(w2,2)); w2];
X=[ww1 -ww2];
k=1;
W=ones(size(X,1),1);
ok=0;
while(ok==0)
for i=1:size(X,2)
if (W'*X(:,i)<0) k=k+1;
W=W+X(:,i);
break;
else
if (i==size(X,2)) ok=1;
end
end
end
end
figure(1)
plot(w1(1,:),w1(2,:),'r.')
hold on
plot(w2(1,:),w2(2,:),'*')
xmin=min(min(w1(1,:)),min(w2(1,:)));
xmax=max(max(w1(1,:)),max(w2(1,:)));
ymin=min(min(w1(2,:)),min(w2(2,:)));
ymax=max(max(w1(2,:)),max(w2(2,:)));
xindex=xmin-1:(xmax-xmin)/100:xmax+1;
yindex=-W(2)*xindex/W(3)-W(1)/W(3);
plot(xindex,yindex)

你透露的信息太少了,起码应该告知一下这个程序是用来干什么的,大概用的是什么算法啊。
看来只能猜了,从最后画出的图来看,感觉这个程序的目的用逼近的方法得到一条分界线的样子,具体是什么算法,看不出来。你看看我的注解,自己研究一下吧。
在网页里可能显得比较乱,你复制粘贴到matlab的编辑器了再看吧。

w1=[0.1 6.8 -3.5 2.0 4.1 3.1 -0.8 0.9 5.0 3.9; 1.1 7.1 -4.1 2.7 2.8 5.0 -1.3 1.2 6.4 4.0]; %输入第一组十个点的平面坐标w1,对应图中的红点
w2=[7.1 -1.4 4.5 6.3 4.2 1.4 2.4 2.5 8.4 4.1;4.2 -4.3 0.0 1.6 1.9 -3.2 -4.0 -6.1 3.7 -2.2];%输入第二组十个点的平面坐标w2,对应图中的蓝星
ww1=[ones(1,size(w1,2)); w1]; %将2行10列的w1前面增加一个全为1的行,将其扩展为3行10列的ww1
ww2=[ones(1,size(w2,2)); w2]; %将2行10列的w2前面增加一个全为1的行,将其扩展为3行10列的ww2
X=[ww1 -ww2]; %将3行10列的ww1和ww2,合并成3行20列的X
k=1; % k在这里应该是定义了一个逼近次数的计数器
W=ones(size(X,1),1); % 感觉W应该是初始化了一个3行1列的向量,里面存得三个数用于得到最后的那条直线
ok=0; %给ok赋初值0, ok在这里应该是定义了一个循环结束的标志,
while(ok==0) %ok初始值为0,当ok的值变为1的时候,下面的循环语句就跳出了
for i=1:size(X,2) %i从1增加到20,相当于一个数组指针,依次对X中的各个列进行操作
if (W'*X(:,i)<0) %这是if语句整个程序的关键,真正的算法就在这里实现,
k=k+1;
W=W+X(:,i); %如果W与X的第i列的点积小于零,则将W与X的第i列进行加和,并赋值给W
break; %跳出for循环体
else
if (i==size(X,2)) %如果W与X的第i列的点积不小于零,则需要看一下是否已经对X中的20组数都进行了判断,
ok=1; %如果已经对X中的20组数都进行了判断,则结束while循环,结束逼近过程
end
end
end
end
figure(1) %新建一个图像窗口
plot(w1(1,:),w1(2,:),'r.') %绘制第一组的十个点,用红点表示
hold on %保持刚才绘制的十个点不被清除,继续绘图
plot(w2(1,:),w2(2,:),'*') %绘制第二组的十个点,用蓝星表示
xmin=min(min(w1(1,:)),min(w2(1,:))); %得到20个点的最小x值
xmax=max(max(w1(1,:)),max(w2(1,:))); %得到20个点的最大x值
ymin=min(min(w1(2,:)),min(w2(2,:))); %得到20个点的最小y值
ymax=max(max(w1(2,:)),max(w2(2,:))); %得到20个点的最大y值
xindex=xmin-1:(xmax-xmin)/100:xmax+1; %生成一个x序列,用于绘制直线
yindex=-W(2)*xindex/W(3)-W(1)/W(3); %计算直线与上面的x序列相对应的y坐标
plot(xindex,yindex) %绘制直线
温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答