确保在Matlab

时间:2016-01-16 00:54:08

标签: matlab loops overwrite

我正在模拟疾病的传播,我想制作一个图像,该图像首次在矩阵的像素中发生感染。

所以我得到了这个:

for t=1:30
        infected=calc_infected(susceptibles, disease, row, col);
        if t < 8                            % The infection occurs in the first week in these pixels                       
           LM(find(infected > 0))= 2        
        elseif t>=8 && t<15                 % The infection occurs in the second week in these pixels
            LM(find(infected > 0))= 3;
        elseif t>=15 && t<22 
            LM(find(infected > 0))= 4;
        elseif t>=22 && t<30 
            LM(find(infected > 0))= 5;
end 

T是以天为单位的时间。 LM是我绘制数据的地图。感染是包含感染的时间演变的基质。我的问题是:因为我想要显示第一次感染发生的时间,我怎样才能确保像素在第二次被感染时不会被覆盖,但在另一个时间分类中?例如。如果某个像素的值已经为2,因为它在t = 5时被感染,但在t = 25时再次被感染,则可能会被值5覆盖。

谢谢!

2 个答案:

答案 0 :(得分:2)

我终于意识到你正在尝试做什么以及你的问题是什么:)如果我理解正确:LM是一个与size相同的数组infected,后者是给定细胞的二元感染状态,LM显示感染的分段时间演变。 LM的每一类值都表示最后被感染的地图部分,您想要跟踪第一个感染时间段。

我建议零初始化LM(你应该为性能做任何事情),然后在覆盖时检查LM的zeroness。阐述我的评论解决方案:

LM = zeros(row,col); % or the size if this is not it
tmax = 30;

for t=1:tmax
   infected = calc_infected(susceptibles, disease, row, col);
   inds = (infected>0) & (~LM);  % only consider LM==0 values
   switch t
      case num2cell(1:7)
         LM(inds)=2;
      case num2cell(8:14)
         LM(inds)=3;
      case num2cell(15:21)
         LM(inds)=4;
      case num2cell(22:29)
         LM(inds)=5;
      otherwise
         % do something if t==30!
   end
end

请注意,我只是将~LM添加到具有逻辑AND的逻辑索引,这是LM==0的简写,即它选择LM中的零索引,就是你需要。

答案 1 :(得分:1)

假设函数的infected输出calc_infected是一个矩阵,其中包含可能存在感染的每一天的数据,您可以直接找到第一个非零值的索引在该矩阵中,使用[row, col] = find(infected, 1, 'first')。然后,正如 @Andras Deak 建议的那样,您可以使用switch语句根据rowcol的输出分配您的标志,假设其中一个代表这些可能感染的日子。例如,如果列表示可能的感染日期,那么您将使用col中的线性索引。如果相反行代表这些天,那么您将使用row。这似乎是最直观的方法。