У меня есть большая квадратная матрица структур, которая представляет существ. Каждое существо может двигаться влево, вверх, вправо или вниз. Я проверяю соседние позиции матрицы на наличие пустых ячеек и выполняю следующие вычисления для новых координат:
function res = Move2(worldDimension,row,col,left,up,right,down)
%In the following matrices, good moves are > 0.
%Directions pattern:
patternMatrix = [0 2 0;
1 5 3;
0 4 0];
%Possible border moves:
borderMatrix = [0 (row>1) 0;
(col>1) 1 (col<worldDimension);
0 (row<worldDimension) 0;];
%Possible neighbor moves:
neighborsMatrix = [0 (up==0) 0 ;
(left==0) 1 (right==0);
0 (down==0) 0;];
%Matrix of possible directions including neighbors and borders
possibleMovesMatrix = ((borderMatrix).*(neighborsMatrix)).*(patternMatrix);
%Vector of possible directions:
possibleMovesVector = sort(possibleMovesMatrix(possibleMovesMatrix(:) > 0));
%Random direction:
randomDirection = possibleMovesVector(randi(length(possibleMovesVector)));
directionCoordsVector = [[row (col-1)];[(row-1) col];[row (col+1)];[(row+1) col];[row col]];
res = [directionCoordsVector(randomDirection,1) directionCoordsVector(randomDirection,2)];
end
Эта функция довольно медленная, когда я запускаю профилировщик, он говорит мне, что:
borderMatrix = [0 (row>1) 0;
(col>1) 1 (col<worldDimension);
0 (row<worldDimension) 0;];
занимает 36% времени, а вот это: randomDirection = PossibleMove... занимает 15% времени. Можно ли как-то ускорить процесс?
Может быть, я могу использовать другой подход, немедленно беря с основного игрового поля свободные места вокруг координаты существа? Если да, то как мне взять подматрицу, если существо находится рядом с границей доски, не имея дело с индексами за границей?
Спасибо, Гай.