MATLAB: How to change the rate of change for surrounding elements after a certain number of rows

if conditionsrandom number generator

InfectionMatrix = zeros(100,100);
InfectionMatrix(50,50) = 1;
for k = 1:1:45
%Finds the infected Nodes
[i,j] = find(InfectionMatrix > 0.7);
%Random Number Generator
a = 0.0270;
b = 0.3250;
RANDOM = (b-a).*rand(8,1) + a;
%Discard the nodes on the edge
i(i == 1) = [];
i(i == length(InfectionMatrix)) = [];
j(j == 1) = [];
j(j == length(InfectionMatrix)) = [];
%Infection Spreads to all surrounding
%elements in the matrix
InfectionMatrix(i-1,j) = InfectionMatrix(i-1,j)+ RANDOM(1);
InfectionMatrix(i-1,j+1) = InfectionMatrix(i-1,j+1)+ RANDOM(2);
InfectionMatrix(i-1,j-1) = InfectionMatrix(i-1,j-1)+ RANDOM(3);
InfectionMatrix(i,j+1) = InfectionMatrix(i,j+1)+ RANDOM(4);
InfectionMatrix(i,j-1) = InfectionMatrix(i,j-1)+ RANDOM(5);
InfectionMatrix(i+1,j+1) = InfectionMatrix(i+1,j+1) + RANDOM(6);
InfectionMatrix(i+1,j-1) = InfectionMatrix(i+1,j-1) + RANDOM(7);
InfectionMatrix(i+1,j) = InfectionMatrix(i+1,j) + RANDOM(8);
rng('shuffle')
%Maximum "Infection" Value is 100
TooHigh = find(InfectionMatrix > 100);
for m = 1:1:length(TooHigh)
InfectionMatrix(TooHigh(m)) = 100;
end
end
%Gives a Representation of the Infection
h = heatmap(InfectionMatrix)
If an infected node is found that exists in a row number 50+ I want the RANDOM increase to be halfed, rather than the standard RANDOM increase.

Best Answer

It is not trivial to identify what the "infected nodes" are and which variable is the "row number 50+". I guess you want to replace:
m = j < 50;
j1 = j(m);
i1 = i(m);
j2 = j(~m);
i2 = i(~m);
InfectionMatrix(i1-1,j1) = InfectionMatrix(i1-1,j1)+ RANDOM(1);
InfectionMatrix(i1-1,j1+1) = InfectionMatrix(i1-1,j1+1)+ RANDOM(2);
InfectionMatrix(i1-1,j1-1) = InfectionMatrix(i1-1,j1-1)+ RANDOM(3);
InfectionMatrix(i1,j1+1) = InfectionMatrix(i1,j1+1)+ RANDOM(4);
InfectionMatrix(i1,j1-1) = InfectionMatrix(i1,j1-1)+ RANDOM(5);
InfectionMatrix(i1+1,j1+1) = InfectionMatrix(i1+1,j1+1) + RANDOM(6);
InfectionMatrix(i1+1,j1-1) = InfectionMatrix(i1+1,j1-1) + RANDOM(7);
InfectionMatrix(i1+1,j1) = InfectionMatrix(i1+1,j1) + RANDOM(8);
InfectionMatrix(i1-1,j1) = InfectionMatrix(i1-1,j1)+ RANDOM(1);
InfectionMatrix(i2-1,j2) = InfectionMatrix(i2-1,j2)+ RANDOM(1) * 0.5;
InfectionMatrix(i2-1,j2+1) = InfectionMatrix(i2-1,j2+1)+ RANDOM(2) * 0.5;
InfectionMatrix(i2-1,j2-1) = InfectionMatrix(i2-1,j2-1)+ RANDOM(3) * 0.5;
InfectionMatrix(i2,j2+1) = InfectionMatrix(i2,j2+1)+ RANDOM(4) * 0.5;
InfectionMatrix(i2,j2-1) = InfectionMatrix(i2,j2-1)+ RANDOM(5) * 0.5;
InfectionMatrix(i2+1,j2+1) = InfectionMatrix(i2+1,j2+1) + RANDOM(6) * 0.5;
InfectionMatrix(i2+1,j2-1) = InfectionMatrix(i2+1,j2-1) + RANDOM(7) * 0.5;
InfectionMatrix(i2+1,j2) = InfectionMatrix(i2+1,j2) + RANDOM(8) * 0.5;
InfectionMatrix(i2-1,j2) = InfectionMatrix(i2-1,j2)+ RANDOM(1) * 0.5;
If this is the wanted result, there are nicer solutions, e.g. to use a subfunction for this block and provide the indices and RANDOM vector as inputs.
By the way: The code looks cleaner, is you use a shorter name for the "InfectionMatrix".
You can replace:
TooHigh = find(InfectionMatrix > 100);
for m = 1:1:length(TooHigh)
InfectionMatrix(TooHigh(m)) = 100;
end
by
InfectionMatrix = min(InfectionMatrix, 100);