EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
源代码在Matlab主程序中运行没有问题,在App designer 中运行,点击完start,关闭元胞自动机页面后页面就会报错。此类型的变量不支持使用点进行索引错误,位置在mov(k)=getframe(gcf);位置。matlab是win 10 64位2018a。 请教大神,非常感谢! ; k" V% ]% x* h( r8 E$ i
; G0 a% f: p- z4 D* C
主程序 * }8 {7 b: d, i- `- T
- 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
7 X0 w( U0 \7 j* e) f2 X 3 r4 @) _, x/ i
复制代码
o6 ?5 l5 p X, \7 n6 c
2 E) J2 T t! m& R* c6 [6 D8 v& L' A9 b7 u' v
里面涉及的函数( H7 L* h; R+ k$ X6 t0 y
- 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
- / k; e1 i( m/ z4 o
Q' J( \/ B1 D5 I/ k
复制代码
+ U4 r' u6 N4 O8 o; F* F- 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
- * k6 N- K8 s$ u; b
* c* [" Y; u$ e: N2 q( {% s9 p9 U+ y
复制代码" p! \: ^/ I4 N8 \- k, D+ g1 r) b- G
- 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
8 E- t3 m9 A9 m+ G# R' u+ x ( I( i) ^( S" W, d/ `
8 x, a; g5 c% @1 g. a
+ u9 ?; L% n5 M Q h9 |2 M4 v
|