⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myhopfieldnet.m

📁 matlab写的神经网络的几个演示程序
💻 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 + -