2016-01-16 2 views
0

Я моделирую распространение болезни, и я хочу создать изображение, которое будет иметь место при первом заражении в пикселе матрицы.Убедиться, что значения не перезаписываются в 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 - это моя карта, на которой я строю свои данные. Заражена матрица, которая содержит временную эволюцию инфекции. Мой вопрос: как я хочу показать, что происходит первая инфекция, как я могу убедиться, что значение пиксела не будет перезаписано, когда оно станет зараженным во второй раз, но в другой классификации времени? Например. если пиксель уже имеет значение 2, потому что он заражен при t = 5, но он снова заражается при t = 25, он может быть перезаписан на значение 5.

Спасибо!

+2

Не связанный с вашим вопросом: вы должны использовать логическую индексацию, 'LM (зараженный> 0) = 2' (если' LM' и 'зараженные' имеют одинаковый размер), и вместо всех этих' elseif 'вы могли бы также используйте 'switch':' inds = infected> 0; 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; end'. Вы также забыли обработать 't == 30'. –

ответ

2

я, наконец, понял, что вы пытаетесь сделать, и то, что ваша проблема :) Если я правильно понимаю: LM массив тех же size как infected, последняя является двоичной инфекцией состояние данной ячейки, и LM показывает сегментированную временную эволюцию инфекции. Каждый класс значений LM указывает часть последней зараженной карты, и вы хотите, чтобы отслеживать только сегмент времени заражения.

Я предлагаю нулевое инициализацию LM (что вы должны делать в любом случае для повышения производительности), а затем отметьте нулевую величину LM при перезаписи. Разрабатывая на моем комментировал решение:

, что я просто добавил ~LM к логическим показателям с логическим И, что стенография для LM==0, т.е. он выбирает нулевые индексы в 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 

Примечание.

+1

Спасибо! Простите, если я не был достаточно ясен в начале, но это именно то, что я хотел. – user5618251

1

Предполагая, что infected выхода из функции, calc_infected, является матрицей, которая включает в себя данные для каждого дня, на которых могут существовать инфекции, вы можете сразу найти индекс первых ненулевых значений в этой матрице, используя [row, col] = find(infected, 1, 'first'). Затем, как и @ Andras Deak, вы можете использовать оператор switch для назначения своих флагов в соответствии с результатами для row или col, считая, что один из них представляет эти возможные дни заражения. Если столбцы, например, представляют возможные дни заражения, то вы должны использовать линейный индекс в col. Если вместо этого строки будут отображаться в эти дни, вы должны использовать row. Это похоже на самый интуитивный подход.

Смежные вопросы