EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
源代码在Matlab主程序中运行没有问题,在App designer 中运行,点击完start,关闭元胞自动机页面后页面就会报错。此类型的变量不支持使用点进行索引错误,位置在mov(k)=getframe(gcf);位置。matlab是win 10 64位2018a。 请教大神,非常感谢! 2 L/ |6 s6 l3 G/ `/ B' _8 K
* Q& L. J) y2 Y8 P* R主程序
* U' m x1 i7 |6 {$ B6 r. o- 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/ A; V' k: d1 i9 Z/ f/ J
* Q5 i( ~; |0 W- V# B复制代码: X0 B7 j8 y* l6 M
, s. W, j. v( z; \
5 Y' [$ U6 D: ~% I- |- ~& k) N里面涉及的函数
8 x0 } Y2 K4 `# z% U2 g7 i- 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
- 5 m/ e. y+ `) N0 O G: J
8 p3 L6 F+ R+ B
复制代码9 a& _" s0 [; G: V* T# b/ C
- 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
- 8 l* b& P+ e7 R! P6 S$ `
0 `" Z, N- e8 U, _5 d复制代码 A3 A& C* ` N* m' `5 j* A: d
- 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
( n; K" Q6 |& X 8 P2 Z5 C7 Q7 W Z4 X0 y
+ b& c* j6 d! o
, Q* ?( _9 [5 c/ g# ~% X |