确保值不会在 Matlab 中被覆盖

Making sure values do not get overwritten in Matlab

我正在为疾病的传播建模,我想制作一张图像,在矩阵的一个像素中绘制第一次感染发生的时间。

所以我得到了这个:

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 是我绘制数据的地图。 Infected 是包含感染时间演化的矩阵。我的问题是:正如我想显示第一次感染发生的时间,我如何确保像素值在第二次感染时不会被覆盖,但在另一个时间分类内?例如。如果一个像素已经具有 2 的值,因为它在 t=5 时被感染,但它在 t=25 时再次被感染,它可以被值 5 覆盖。

已经谢谢了!

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

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

我建议 zero-initializing LM(为了性能你应该这样做),然后在覆盖时检查 LM 的零性。详细说明我评论的解决方案:

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 添加到逻辑索引,对于 LM==0 是 short-hand,即它选择 LM 中的零索引,正是你所需要的。