确保值不会在 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 语句根据 row
或 col
的输出分配标志,假设其中之一它们代表这些可能的感染天数。例如,如果列表示可能的感染天数,那么您将使用 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
中的零索引,正是你所需要的。
我正在为疾病的传播建模,我想制作一张图像,在矩阵的一个像素中绘制第一次感染发生的时间。
所以我得到了这个:
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 语句根据 row
或 col
的输出分配标志,假设其中之一它们代表这些可能的感染天数。例如,如果列表示可能的感染天数,那么您将使用 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
中的零索引,正是你所需要的。