📄 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=<noise<=1):\n');
if (noise>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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -