24小时热门版块排行榜    

查看: 1141  |  回复: 5

wangyongjian

金虫 (初入文坛)

[求助] 一段MATLAB代码向量化

各位大神好,小弟在进行元胞自动机相关工作时候,觉得目前代码速度太慢。想将其向量化,下面这段想了好久还是不得其解。
首先,不知道能不能向量化?
第二,如果能,不知道怎么办?
所以再次求助各位路过的大神,将下列代码向量化!矩阵S见附件,为方便各位大神,附件code是下面代码的整洁版。
kk=500;    % 定义循环次数
N=size(S,1);
epss=0.0001;
for k=1:kk;   
     
    S2=S([end 1:end-1],  ;  % S 上近邻矩阵
    S8=S([2:end 1],;        % S 下近邻矩阵
    S4=S(:,[end 1:end-1]);    % S 左近邻矩阵
    S6=S(:,[2:end 1])  ;      % S 右近邻矩阵
    S1=S2(:,[end 1:end-1]);   % S 左上近邻矩阵
    S3=S2(:,[2:end 1]);       % S 右上近邻矩阵
    S7=S8(:,[end 1:end-1]);   % S 左下近邻矩阵
    S9=S8(:,[2:end 1]);       % S 右下近邻矩阵

    Va1=zeros(N,N);   %预分配矩阵
    DE=zeros(N,N);   %预分配矩阵
    P2=zeros(N,N);   %预分配矩阵

   for m=1:N;
      for n=1:N;
         Va=[S1(m,n),S2(m,n),S3(m,n),S4(m,n),S6(m,n),S7(m,n),S8(m,n),S9(m,n)];
             B=(sum(abs(S(m,n)-Va))<epss);  
               
               La=find(Va<=0);
               Lb=find(Va>0);  
         if  S(m,n)>0   
             E0=0.4*(length(Lb)-sum(abs(S(m,n)-Va(Lb))<epss));
             index=round(1+7.*rand);  %定义索引指数
             Va1(m,n)=Va(index);   %抽取的邻居
             if   (Va1(m,n)>0 )    %必须找到非0的邻居来转变
               E1=0.4*(length(Lb)-sum(abs(Va(index)-Va(Lb))<epss));%转变后元素的状态
                DE(m,n)=E1-E0;     %计算转变前后的状态值之差
                P2(m,n)=1.*(DE(m,n)<=0);  %计算转变概率
             end
         end
      end
   end
      R2=rand(N,N);    % 生成随机数与P1来比较
      C0=(R2<P2);     % C0=1表示元胞转变成功,C0=0表示元胞转变不成功
      S0 =S;     % 记录当前状态,
    %////// 按规则的优先级由低到高执行2个规则
    S =S0.*(1-C0)+ C0.*Va1;    % 规则2,选取降幅最大的元胞转变
    S((B>0.5))=S0((B>0.5));    % 规则1,不转变
    SA=S;   %把矩阵保存在另一个数组里,用作显示矩阵
  
     for m=1:N-1    % 对矩阵里面的所有元胞扫描
        for n=1:N-1  % 对矩阵里面的所有元胞扫描
            if((SA(m,n)>=1 && SA(m,n+1)>=1 && SA(m,n)~=SA(m,n+1))) %如果左右相邻的元胞不相等
                SA(m,n)=0; % 将元胞显示状态值置为0     
              % SA(m,n+1)=0; %将元胞右邻居显示状态值置为0
            end;
            if((SA(m,n)>=1 && SA(m+1,n)>=1 && SA(m,n)~=SA(m+1,n))) %如果上下相邻的元胞不相等
               SA(m,n)=0;    % 将元胞显示状态值置为0   
              % SA(m+1,n)=0;  %将元胞下邻居显示状态值置为0
            end;
        end;
    end;            
end
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : Code.m
  • 2015-12-28 18:52:19, 2.23 K
  • 附件 2 : S.mat
  • 2015-12-28 18:52:19, 7.91 K

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

混不好我就不回来了
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

wangyongjian

金虫 (初入文坛)

自己顶一下
混不好我就不回来了
2楼2015-12-28 22:02:34
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

wangyongjian

金虫 (初入文坛)

不要沉不要沉
混不好我就不回来了
3楼2015-12-29 11:45:11
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

tk凌峰人

银虫 (著名写手)

不要沉入海底

发自小木虫Android客户端

» 本帖已获得的红花(最新10朵)

宁静致远
4楼2015-12-29 12:14:56
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

wangyongjian

金虫 (初入文坛)

再顶一下。不要沉。
混不好我就不回来了
5楼2015-12-30 10:13:49
已阅   关注TA 给TA发消息 送TA红花 TA的回帖

wangyongjian

金虫 (初入文坛)

送红花一朵
引用回帖:
4楼: Originally posted by tk凌峰人 at 2015-12-29 12:14:56
不要沉入海底

6楼2015-12-30 15:07:23
已阅   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 wangyongjian 的主题更新
信息提示
请填处理意见