| 
源代码在Matlab主程序中运行没有问题,在App designer 中运行,点击完start,关闭元胞自动机页面后页面就会报错。
x
EDA365欢迎您登录!您需要 登录 才可以下载或查看,没有帐号?注册  此类型的变量不支持使用点进行索引错误,位置在mov(k)=getframe(gcf);位置。matlab是win 10 64位2018a。 请教大神,非常感谢! - |% \4 ^! b% d5 ?5 G4 ]  t* ^, }3 S. X' A
 
 主程序 5 W- j. T( D  \9 o" M, Y' T
 5 A4 Z4 x, H; |1 I" x+ A- V( Yfunction 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    end7 L  N7 |& ?  B5 [: |( f9 S+ ?
 复制代码; U. a) u* c, p% d# e6 ~
 * o# y+ v6 H5 n* Z, N" y
 
 5 |- \+ u% g* a- ]5 ?% x% j" ]里面涉及的函数
 ^/ b6 a& L9 @) @1 t+ @( Q: p
 + a& M2 J/ H" v" [* w) Y5 p$ dfunction [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;endendng = reshape(ng1, 8, 2);[in, jn]= deal(ng(:,1), ng(:,2)); %相当于 in=ng(:,1),jn=ng(:,2)end; q! T3 n2 A" Z! D+ L
 复制代码2 j( ~+ u4 ^8 n: a) e4 |
 
 function NmeCalt=NmeCalUpt(Nme)NmeCal=[];Nme1=sort(Nme( : ));while 1h=0;u=Nme1(1);for j=1:length(Nme1)if u==Nme1(j);h=h+1;endendNmeCal=cat(1,NmeCal,[u,h]);Nme1(1:h)=[];if isempty(Nme1); break; endendNmeCal(1,: )=[];NmeCalt=sortrows(NmeCal,-2);end8 U) W6 s' ?* R0 N0 s5 G
 # J1 x5 f0 k% [复制代码
 & K. S/ K1 {" \1 ~" |
 $ U/ [# y, E  i, U$ m4 P0 ~# D: Q7 cfunction 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});elseC{i,j}{2}=sum(SubstPro(:,C{i,j}{1}));for k = 1:8C{in(k), jn(k)}{2}=C{in(k), jn(k)}{2}-...    0.00125*(SubstConsm(C{i,j}{1})-C{i,j}{2});end                            end                        elseC{i,j}{1}=0;                        endelse %若此菌为“骗子”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});elseC{i,j}{2}=0;for k = 1:8C{in(k), jn(k)}{2}=C{in(k), jn(k)}{2}-...    0.025*(SubstConsm(C{i,j}{1})-C{i,j}{2});endendelseC{i,j}{1}=0;endendendendendCt=C;end4 \3 k9 \$ j4 I- l% z
 
 2 }( E/ i/ O( T2 V# o) @6 M2 r5 {4 c3 M) A' j  d
 
 |