EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
源代码在Matlab主程序中运行没有问题,在App designer 中运行,点击完start,关闭元胞自动机页面后页面就会报错。此类型的变量不支持使用点进行索引错误,位置在mov(k)=getframe(gcf);位置。matlab是win 10 64位2018a。 请教大神,非常感谢! / s8 H ^3 m' K; W/ n$ {) `
# f7 Z8 {' G- f7 t6 x1 ?主程序
. `, q6 {* _3 C7 B W/ S2 }7 }- function start(app)
- m=100;
- n=100;
- C=cell(n);
- Nme=zeros(n+1);
- Nme(1:n,1:n)=ceil(m*rand(n));
- SubstPro1=0.045*rand(20,40);
- SubstPro=cat(2,SubstPro1,zeros(20,60));
- SubstConsm=rand(1,m);
- SubstCell=2*ones(n);
- x=linspace(0,1,n+1);
- y=linspace(0,1,n+1);
- [X,Y]=meshgrid(x,y);
- h0=pcolor(app.UIAxes,X,Y,Nme)
- colormap(app.UIAxes,jet(101));
- colorbar;
- set(h0,'edgecolor','none');
- title(app.UIAxes,'元胞的初始状态')
- axis square
- axis off
- for i=1:n
- for j=1:n
- C{i,j}{1}=Nme(i,j);
- C{i,j}{2}=SubstCell(i,j);
- end
- end
- N=50;
- for k=1:N
- Ck{k}=C;
- C=UpdateCell(C,n,SubstPro,SubstConsm);
- for i=1:n
- for j=1:n
- Nme(i,j)=C{i,j}{1};
- end
- end
- h=pcolor(app.UIAxes,X,Y,Nme);
- set(h,'edgecolor','none');
- colormap(app.UIAxes,jet(101));
- title(app.UIAxes,['\bf 元胞更新',num2str(k),'月后的空间状态'])
- colorbar;
- axis square
- axis off
- saveas(gcf, [num2str(k)],'jpg');
- frame=imread(k,'jpg');
- writeVideo(mov,frame);
- end
- save('mov','mov');
- %myObj=VideoWriter('newfile.avi');
- %writerObj.FreameRate=5;
- %open(myObj);
- %writeVideo(myObj,mov);
- %close(myObj);
- end
- end
& p! f7 S6 I' w; }2 M# i1 q 1 x3 N$ d0 O# z3 W8 v, d
复制代码7 ` L0 W1 w! z$ U1 N
1 |( f! J/ |# ]3 R# m7 {* F6 |: m5 C+ B2 _1 T. S! @0 Y5 C. Z
里面涉及的函数" M2 m# s; F7 C0 Z( b C0 Q
- function [in, jn] = GetNeigbr(i, j, n)
- % ====本函数根据元胞自己的索引,确定其邻居的索引,采用周期边界=====
- % =====i, j 为元胞自己的索引,n 为行数或列数======
- zs = [i-1, j-1]; s = [i-1, j]; ys = [i-1, j+1]; % 上面的邻居
- z = [i, j-1]; y = [i, j+1]; % 左右的邻居
- zx = [i+1, j-1]; x = [i+1, j]; yx = [i+1, j+1]; % 下面的邻居
- ng = [zx; x; yx; z; y; zs; s; ys]; % 8 个邻居的位置
- ng1 = ng( : );
- for j = 1: length(ng1)
- if ng1(j)<1; ng1(j) = n;
- elseif ng1(j)>n; ng1(j) = 1;
- end
- end
- ng = reshape(ng1, 8, 2);
- [in, jn]= deal(ng(:,1), ng(:,2)); %相当于 in=ng(:,1),jn=ng(:,2)
- end
- " D1 d+ h$ g% {* b8 z+ t7 x. A
: R% o8 A4 V+ h# `# g6 p( J
复制代码5 k+ P5 r5 } y1 a0 ~
- function NmeCalt=NmeCalUpt(Nme)
- NmeCal=[];
- Nme1=sort(Nme( : ));
- while 1
- h=0;
- u=Nme1(1);
- for j=1:length(Nme1)
- if u==Nme1(j);h=h+1;end
- end
- NmeCal=cat(1,NmeCal,[u,h]);
- Nme1(1:h)=[];
- if isempty(Nme1); break; end
- end
- NmeCal(1,: )=[];
- NmeCalt=sortrows(NmeCal,-2);
- end
- & T! P9 b3 k$ j- S
" y- p. j, y. b7 C. G9 E/ X复制代码2 b1 ]* d5 X& J! a# s
- function Ct=UpdateCell(C,n,SubstPro,SubstConsm)
- % =====各元胞上微生物状态的更新===============
- for i = 1:n
- for j = 1:n
- [in, jn] = GetNeigbr(i, j, n); % (i,j)元胞邻居的索引
- neighbsubt = [];
- for k = 1:8
- neighbsubt = cat(1, neighbsubt, C{in(k), jn(k)}{2});
- end
- SubstNeigb(i,j) =sum(neighbsubt); %计算(i,j)元胞邻居底物浓度之和
- if C{i, j}{1} == 0; % 表示此元胞上没有微生物
- sp = [];
- for k = 1:8
- sp = cat(1, sp, C{in(k), jn(k)}{1});
- end
- if all(sp == 0) % 表示周围邻居位置中没有物种占领
- C{i, j}{1} = 0;
- else
- sp1 = sp;
- sp1(sp1==0) =[]; % 把为物种 0 的元胞位置去除
- m = randi([1, length(sp1)],1,1); % 表示从周围邻居任找一物种占领此位置
- mi = find(sp==sp1(m));
- C{i, j}{1}= C{in(mi(1)), jn(mi(1))}{1};
- end
- C{i, j}{2} = C{i, j}{2}; %此元胞内底物浓度不变
- else
- if C{i,j}{1}<=40 %若此菌为“好人”
- if (0.01*SubstNeigb(i,j)+C{i,j}{2})>=SubstConsm(C{i,j}{1})
- C{i,j}{1}=C{i,j}{1};
- if C{i,j}{2}>=SubstConsm(C{i,j}{1})
- C{i,j}{2}=C{i,j}{2}+sum(SubstPro(:,C{i,j}{1}))-SubstConsm(C{i,j}{1});
- else
- C{i,j}{2}=sum(SubstPro(:,C{i,j}{1}));
- for k = 1:8
- C{in(k), jn(k)}{2}=C{in(k), jn(k)}{2}-...
- 0.00125*(SubstConsm(C{i,j}{1})-C{i,j}{2});
- end
- end
- else
- C{i,j}{1}=0;
- end
- else %若此菌为“骗子”
- if (0.2*SubstNeigb(i,j)+C{i,j}{2})>=SubstConsm(C{i,j}{1})
- %底物浓度判断
- C{i,j}{1}=C{i,j}{1};
- if C{i,j}{2}>=SubstConsm(C{i,j}{1})
- %若元胞底物足够供“骗子”生存
- C{i,j}{2}=C{i,j}{2}-SubstConsm(C{i,j}{1});
- else
- C{i,j}{2}=0;
- for k = 1:8
- C{in(k), jn(k)}{2}=C{in(k), jn(k)}{2}-...
- 0.025*(SubstConsm(C{i,j}{1})-C{i,j}{2});
- end
- end
- else
- C{i,j}{1}=0;
- end
- end
- end
- end
- end
- Ct=C;
- end
" k3 n4 W* s. `3 c
+ N2 [- y% U' F9 ~" y* V* c! E! Z
+ I" n5 o& R6 M
0 f- B, v+ s9 R4 d4 G |