EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
源代码在Matlab主程序中运行没有问题,在App designer 中运行,点击完start,关闭元胞自动机页面后页面就会报错。此类型的变量不支持使用点进行索引错误,位置在mov(k)=getframe(gcf);位置。matlab是win 10 64位2018a。 请教大神,非常感谢!
% O7 S5 S5 S& g" q! P# V0 `( y" T* s' Z
主程序
8 `3 J3 e3 L' ]! c# X% Q- 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- }6 O: v5 @0 z: ^0 U# E: v
; s: a9 T* C- U+ T$ l R" Z复制代码/ W- t! x$ j. I2 y; \. X2 Q/ k
4 i# B! @! i8 f$ k' g; U7 H
4 ?* G- Q9 U, g; y: T5 Y' \1 W里面涉及的函数
3 `7 W6 v2 M0 `7 v1 V; Y- l! O- 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
* Y2 a- ]& T, E6 k3 h$ H
/ M1 M4 \# y. S. C8 l复制代码- i4 e8 n8 q; ~% x: `
- 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
; m! J/ A3 a* P, T! g } 1 A# j* j$ ?& q. F
复制代码
8 n0 v* @( Y9 `1 R8 p# V8 P- 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
# ~% O% V! f, a: O5 L 0 i2 @4 h/ [7 g* z
' I$ e# G, X3 u% v$ m- F' t1 H
: G! c$ `1 B# a7 y |