Matlab - 获取具有条件/移动功能的相邻单元格

时间:2013-01-22 14:55:24

标签: matlab matrix conditional-statements cells neighbours

我有一个代表生物的大方阵结构。每个生物都可以向左,向上,向右或向下移动。我正在检查空单元格的相邻矩阵位置,并对新坐标进行以下计算:

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%的时间。有没有办法加快这个过程?

也许我可以采取不同的方法,从主游戏板上立即围绕生物坐标的自由点?如果是这样,如果一个生物靠近棋盘边界而不必处理离线索引,我该如何拍摄一个子矩阵?

谢谢, 盖

2 个答案:

答案 0 :(得分:1)

所以你有一个结构数组,并在数组内移动结构?这对我来说似乎效率极低。

另外,borderMatrix - 行花费这么长时间的原因是因为你构建了一个可能很大的数组。

以下是处理移动生物的建议:

将您的生物存储为nCreatures-by-mProperties数值数组。在要爬行单个字段的数组列上应用函数要容易得多。例如creatures = [x,y,prop1,prop2];

逐个移动你的生物:

for iCreature = 1:nCreatures
    currentPos = creatures(iCreature,1:2);

    %# initialize array of allowed moves with border conditions
    goodMoves = [currentPos(1) > 1, currentPos(2) > 1, currentPos(1) < maxX, currentPos(2) < maxY, true];

    %# check for neighbors
    if any(creatures(:,1) == currentPos(1) - 1 & creatures(:,2) == currentPos(2))
       goodMoves(1) = false;
    end
    %# etc

    %# identify remaining good moves
    if any(goodMoves(1:4))
       goodMoveIdx = find(goodMoves);
       move = goodMoveIdx(randi(length(goodMoveIdx)));
    else
       move = 5; %# remain stationary
    end
end

答案 1 :(得分:0)

目前尚不清楚是否存在多个高度依赖的生物,否则这将是一个有效的工作流程:

  1. 为每个生物生成1个随机数
  2. 确定每个生物有多少可能的移动
  3. 使用相应的随机数进行选择
  4. 如果他们是依赖的,但不是太多,你可以多次这样做,直到找到可行的值或在步骤2中包含依赖。