function [W,num]=my_func(w1,w2,W,c)
% W为权向量,d为判别函数,num为W更新次数,
% 注意:W(k+1)=W(k),[W(k)'*Xi>0] 不记入更新次数
% w1,w2为输入的两个类别,样本x(i)以列存放于w1,w2中
% W为自定义的初始权向量
% c为自定义校正增量
%---------------------输入数据处理-----------------------
% 将输入的两类训练样本写成增广向量形式,并进行规范化处理
% 将w1,w2的样本处理完成后都存放于矩阵X中,以便后续计算
% X以列存放样本,先存放w1,后存放w2
for ii=1:size(w1,2) % w1写成增广向量形式
X(:,ii)=[w1(:,ii);1];
end
for ii=1:size(w2,2) % w2写成增广向量形式,并乘以-1
X(:,ii+size(w1,2))=[w2(:,ii);1]*-1;
end
kk=1; % X(kk)当前的X(i)
num=0; % 迭代次数
%--------------------感知器算法----------------------
% 根据W'*X是否有元素小于0,决定是否结束运算
% 只要W'X全部大于0,结束循环
while(any(W'*X<=0))
while(W'*X(:,kk)>0) % W'与当前X(kk)相乘,若大于0,则
kk=kk+1; % kk++,判断下一个X(kk)是否满足
if kk==5
kk=1;
end
end
W=W+c*X(:,kk); % 当W'*x(kk)小于0时,更新W
num=num+1; % 记录W更新次数,
if(num>1000) % 更新次数大于1000时,退出计算
warndlg('迭代次数大于1000,分类失败')
W=[0;0;0]; % 分类失败,W赋值全0,防止画图
break;
end
end
end