www.pudn.com > AnnInMat.rar > MyHopfieldNet.m


function main() 
clc 
close all 
clear all 
% 输入模式 
m=12;n=10; 
num0=[-1  1  1  1  1  1  1  1  1 -1; 
    1  1  1  1  1  1  1  1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1  1  1  1  1  1  1  1  1  1; 
    -1  1  1  1  1  1  1  1  1 -1]; 
 
num1=[-1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1  1  1  1 -1 -1 -1 -1; 
    -1 -1  1  1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1  1  1  1  1  1  1 -1 -1]; 
 
num2=[-1 -1 -1 -1  1  1  1 -1 -1 -1; 
    -1 -1  1  1  1  1  1  1 -1 -1; 
    -1  1  1 -1 -1 -1 -1  1  1 -1; 
    -1  1 -1 -1 -1 -1 -1 -1  1  1; 
    1 -1 -1 -1 -1 -1 -1  1  1 -1; 
    -1 -1 -1 -1 -1 -1  1  1 -1 -1; 
    -1 -1 -1 -1 -1  1  1 -1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1 -1  1  1 -1 -1 -1 -1 -1; 
    -1 -1  1  1 -1 -1 -1 -1 -1 -1; 
    -1  1  1 -1 -1 -1 -1 -1 -1 -1; 
    1  1  1  1  1  1  1  1  1  1]; 
 
num3=[ 1  1  1  1  1  1  1  1  1 -1; 
    -1 -1 -1 -1 -1 -1 -1 -1  1 -1; 
    -1 -1 -1 -1 -1 -1  1  1 -1 -1; 
    -1 -1 -1 -1  1  1 -1 -1 -1 -1; 
    -1 -1  1  1 -1 -1 -1 -1 -1 -1; 
    1  1  1  1  1  1  1  1 -1 -1; 
    -1 -1 -1 -1 -1 -1 -1 -1  1 -1; 
    -1 -1 -1 -1 -1 -1 -1 -1 -1  1; 
    -1 -1 -1 -1 -1 -1 -1 -1  1 -1; 
    1 -1 -1 -1 -1 -1 -1 -1  1 -1; 
    -1  1 -1 -1 -1 -1 -1  1 -1 -1; 
    -1 -1  1  1  1  1  1 -1 -1 -1]; 
 
num4=[-1 -1 -1 -1 -1  1  1  1 -1 -1; 
    -1 -1 -1 -1  1  1  1  1 -1 -1; 
    -1 -1 -1  1  1 -1  1  1 -1 -1; 
    -1 -1 -1  1  1 -1  1  1 -1 -1; 
    -1 -1  1  1 -1 -1  1  1 -1 -1; 
    -1 -1  1  1 -1 -1  1  1 -1 -1; 
    -1  1  1 -1 -1 -1  1  1 -1 -1; 
    1  1 -1 -1 -1 -1  1  1 -1 -1; 
    1  1  1  1  1  1  1  1  1  1; 
    1  1  1  1  1  1  1  1  1  1; 
    -1 -1 -1 -1 -1 -1  1  1 -1 -1; 
    -1 -1 -1 -1 -1 -1  1  1 -1 -1]; 
 
num_tab = cat(3,num0,num1,num2,num3,num4);%矩阵合并 
vector_tab=[]; 
 
% row=size(num_tab,1); 
% col=size(num_tab,2); 
 
%转换矩阵为向量 
for i=1:size(num_tab,3) 
%     pattern_plot(num_tab(:,:,i),m,n); 
    temp=[]; 
    for k=1:m 
        temp=cat(2,temp,num_tab(k,:,i)); 
    end   
    vector_tab=cat(1,vector_tab,temp); 
end 
 
% 建立Hopfield网络权值矩阵(外积法) 
net_unit=m*n; 
w=zeros(m*n,m*n); 
for i=1:size(vector_tab,1) 
    vector=vector_tab(i,:); 
    w=w+vector'*vector; 
end 
for i=1:m*n 
    w(i,i)=0; 
end 
 
%添加噪声 
noise=input('请输入噪声系数(0=1 | noise<0) 
    error('噪声系数超出[0,1]范围'); 
end 
vector_tab = noisy(vector_tab,noise);%加噪 
 
display_tab=[]; 
for i=1:size(vector_tab,1) 
    display_tab=(reshape(vector_tab(i,:),n,m))'; 
    pattern_plot(display_tab,m,n); 
end 
 
% 联想记忆过程 
for i=1:size(vector_tab,1) 
    vector=vector_tab(i,:); 
    flag=1; 
    sum=0; 
    while (flag==1 & sum<5000) 
        sum=sum+1; 
        flag=0; 
        for j=1:size(vector,2) 
            a=sign(w(j,:)*vector'); 
            if a~=vector(j) 
                flag=1; 
                vector(j)=a; 
            end 
        end 
    end 
    sum 
    result=(reshape(vector,n,m))'; 
    pattern_plot(result,m,n); 
end 
%======================添加噪声========================= 
function x = noisy(tab,nv) 
 
if nv ==0 
    x=tab;return; 
end 
if nv ==1 
    x=-tab;return; 
end 
[xx,yy]=size(tab); 
nv=round(nv*yy);%得到噪声面积 
fprintf('noisy...\nWait...\n'); 
for ii=1:xx 
    nn=sort(round(yy*rand(1,nv))); 
    while nn(1)==0 
        nn=sort(round(yy*rand(1,nv))); 
    end 
    for kk=1:nv 
        tab(ii,nn(kk))=-tab(ii,nn(kk)); 
    end 
end 
fprintf('noisy Done.\n'); 
x=tab; 
 
% =====================模式绘制=========================== 
function pattern_plot(p,r,c) 
x=[-.1 -.1  .1  .1 ]*4; 
y=[-.1  .1  .1 -.1 ]*4;	%块大小 
figure; 
hold on 
axis('manual','off','ij')%坐标轴对齐、隐藏、反转 
axis([2 c-1 0 r+1])%坐标范围 
axis('equal');%单元格正方 
for j=1:c 
    for i=1:r 
        if p(i,j)==1 
            u=x+j; 
            v=y+i; 
            fill(u,v,'m')%绘制紫框 
        else 
            plot(j,i,'rd','markersize',3) 
        end 
    end 
end