matlab中的一段程序,哪位大神给详细解释一下~~
fork=1:mktmp=cputime;fori=1:sforj=1:s%计算邻居中每种状态的个数cnt1=0;cnt2=0;cnt3=0;ifi-1>0&&j-1>0...
for k=1:mk
tmp=cputime;
for i=1:s
for j=1:s
% 计算邻居中每种状态的个数
cnt1=0;
cnt2=0;
cnt3=0;
if i-1>0&&j-1>0
cnt1=cnt1+state1(i-1,j-1);
cnt2=cnt2+state2(i-1,j-1);
cnt3=cnt3+state3(i-1,j-1);
end
if i-1>0&&j+1<=s
cnt1=cnt1+state1(i-1,j+1);
cnt2=cnt2+state2(i-1,j+1);
cnt3=cnt3+state3(i-1,j+1);
end
if i+1<=s&&j+1<=s
cnt1=cnt1+state1(i+1,j+1);
cnt2=cnt2+state2(i+1,j+1);
cnt3=cnt3+state3(i+1,j+1);
end
if i+1<=s&&j-1>0
cnt1=cnt1+state1(i+1,j-1);
cnt2=cnt2+state2(i+1,j-1);
cnt3=cnt3+state3(i+1,j-1);
end
if j-1>0
cnt1=cnt1+state1(i,j-1);
cnt2=cnt2+state2(i,j-1);
cnt3=cnt3+state3(i,j-1);
end
if j+1<=s
cnt1=cnt1+state1(i,j+1);
cnt2=cnt2+state2(i,j+1);
cnt3=cnt3+state3(i,j+1);
end
if i-1>0
cnt1=cnt1+state1(i-1,j);
cnt2=cnt2+state2(i-1,j);
cnt3=cnt3+state3(i-1,j);
end
if i+1<=s
cnt1=cnt1+state1(i+1,j);
cnt2=cnt2+state2(i+1,j);
cnt3=cnt3+state3(i+1,j);
end
s=100; % 棋盘宽,棋盘是方的,即每行每列可以有100个元胞自动机
w=8; % 每一个元胞的像素宽度
mk=10; %循环最大次数
board=zeros(w*s,s*w); %棋盘图片
state1=zeros(s,s); %元胞自动机的状态1
state2=zeros(s,s); %元胞自动机的状态2
state3=zeros(s,s); %元胞自动机的状态3
p1=0.01; %决策概率p1
%% 初始化
for i=1:s
for j=1:s
rnum = rand;
if rnum<1/3 % 以等概率随机初始化自动机的3个状态
state1(i,j)=1; % 其实分的随机设置状态会导致非常离散的点,最后收敛时棋盘上剩下些孤立的点
elseif rnum < 2/3
state2(i,j)=1;
else
state3(i,j)=1;
end
end
end
figure;
%% 更新状态
%用于记录各个状态的数目
resultnum=zeros(mk,3);
这个程序之前的一段 展开
tmp=cputime;
for i=1:s
for j=1:s
% 计算邻居中每种状态的个数
cnt1=0;
cnt2=0;
cnt3=0;
if i-1>0&&j-1>0
cnt1=cnt1+state1(i-1,j-1);
cnt2=cnt2+state2(i-1,j-1);
cnt3=cnt3+state3(i-1,j-1);
end
if i-1>0&&j+1<=s
cnt1=cnt1+state1(i-1,j+1);
cnt2=cnt2+state2(i-1,j+1);
cnt3=cnt3+state3(i-1,j+1);
end
if i+1<=s&&j+1<=s
cnt1=cnt1+state1(i+1,j+1);
cnt2=cnt2+state2(i+1,j+1);
cnt3=cnt3+state3(i+1,j+1);
end
if i+1<=s&&j-1>0
cnt1=cnt1+state1(i+1,j-1);
cnt2=cnt2+state2(i+1,j-1);
cnt3=cnt3+state3(i+1,j-1);
end
if j-1>0
cnt1=cnt1+state1(i,j-1);
cnt2=cnt2+state2(i,j-1);
cnt3=cnt3+state3(i,j-1);
end
if j+1<=s
cnt1=cnt1+state1(i,j+1);
cnt2=cnt2+state2(i,j+1);
cnt3=cnt3+state3(i,j+1);
end
if i-1>0
cnt1=cnt1+state1(i-1,j);
cnt2=cnt2+state2(i-1,j);
cnt3=cnt3+state3(i-1,j);
end
if i+1<=s
cnt1=cnt1+state1(i+1,j);
cnt2=cnt2+state2(i+1,j);
cnt3=cnt3+state3(i+1,j);
end
s=100; % 棋盘宽,棋盘是方的,即每行每列可以有100个元胞自动机
w=8; % 每一个元胞的像素宽度
mk=10; %循环最大次数
board=zeros(w*s,s*w); %棋盘图片
state1=zeros(s,s); %元胞自动机的状态1
state2=zeros(s,s); %元胞自动机的状态2
state3=zeros(s,s); %元胞自动机的状态3
p1=0.01; %决策概率p1
%% 初始化
for i=1:s
for j=1:s
rnum = rand;
if rnum<1/3 % 以等概率随机初始化自动机的3个状态
state1(i,j)=1; % 其实分的随机设置状态会导致非常离散的点,最后收敛时棋盘上剩下些孤立的点
elseif rnum < 2/3
state2(i,j)=1;
else
state3(i,j)=1;
end
end
end
figure;
%% 更新状态
%用于记录各个状态的数目
resultnum=zeros(mk,3);
这个程序之前的一段 展开
1个回答
展开全部
...您这程序不太完整。。。感觉像是细胞自动机的模拟。
整体是一个大的loop,从1到mk循环,应该是时间的流逝。
里面是双循环,也就是每行的细胞都判断自己邻居的状态。
每个细胞有8个邻居,每个邻居有3种状态,然后用cnt变量来存贮这些状态。
if语句是用来判断有没有超出边界的,因为matlab的矩阵index最小为1,越界访问会出错
整体是一个大的loop,从1到mk循环,应该是时间的流逝。
里面是双循环,也就是每行的细胞都判断自己邻居的状态。
每个细胞有8个邻居,每个邻居有3种状态,然后用cnt变量来存贮这些状态。
if语句是用来判断有没有超出边界的,因为matlab的矩阵index最小为1,越界访问会出错
更多追问追答
追问
这是我找人帮我编的元胞自动机,但是看不太懂。
其他的都没问题 ,就是元胞的规则这段有点看不懂。
你能把这个程序里面 元胞怎么根据邻居行动的具体规则 说一下吗?我怕程序没弄对,3Q~
追答
囧。。。您发的初始化部分没什么用处啊。。。
是这样的,元胞自动机是模拟大量个体依照某种既定规则的情况下究竟会演变成什么样的情况的良好工具,至于规则是自己制定的。您发的程序里面只有收集邻居状态的以及初始化元胞状态的代码,核心部分,也就是元胞得知邻居状态后该怎么处理还是没有写清楚。
举个例子吧,一个经典的生命演化的元胞自动机,模拟一种单细胞生物的生存。规则就是查看自己的活邻居个数。多于5个,这个细胞就会因为“拥挤”而死,少于3个,就会“孤独”而死。然后如果某时刻某个死掉的细胞周围有3到5个邻居,它就会复活。
这种就是所谓规则。您目前的代码只是统计了邻居的状态,紧接着的代码应该就是规则了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询