0

我有一个像这样的向量,它代表板上的水平/垂直尺寸

Hor   Verti
 1    2
 2    3 
 4    1 
 2    3      
 2    2 
 1    4 
 ..... and many more

我还有一个 (1, 1) 的起始向量。我想子选择该矩阵的所有行,其中水平 == 1 和垂直距离 +-2 个单位,或垂直 == 1 和水平 = +-2。

可以将其想象成迷你 4x4 棋盘上的车,它一次只能移动 2 个空格。我想从一系列提议的空间中找到它可以移动到的所有有效空间,一些提议存在不止一次是可以的,因为它们是由不同的人提议的。

我想要提案的子集

[ (Hori== sInitial(1) && (Vert - sInitial(2) <=2) )
 ||           (Vert == sInitial(2) && (Hori - sInitial(1) <=2) ) 
   ]

没有for循环可以做到这一点吗?

4

2 回答 2

1

对于可能位置的 4x4 网格:

>> [x,y] = ndgrid(1:4,1:4)
x =
     1     1     1     1
     2     2     2     2
     3     3     3     3
     4     4     4     4
y =
     1     2     3     4
     1     2     3     4
     1     2     3     4
     1     2     3     4

>> xy = [x(:) y(:)];

如果玩家就位pos = [2 3]并允许最多移动 2 个空间(水平或垂直),则可能的移动将是:

>> idx = (pdist2(xy, pos, 'cityblock') <= 2) & any(bsxfun(@eq, xy, pos), 2);
>> M = reshape(double(idx), [4 4]); M(pos(1),pos(2)) = nan;
M =
     0     0     1     0
     1     1   NaN     1
     0     0     1     0
     0     0     1     0

(我用 标记了初始位置,用 标记了NaN可能的移动,用标记了1网格的其余部分0)。

或就坐标而言:

>> coords = xy(idx,:)
coords =
     2     1
     2     2
     1     3
     2     3
     3     3
     4     3
     2     4

上面的pdist2函数计算曼哈顿距离

于 2013-09-13T01:34:10.913 回答
1

这很容易。给定一些数据

data = [1    2
        2    3 
        4    1 
        2    3      
        2    2 
        1    4
        3    1];

只需这样做:

row_indices = find( (data(:,1)==1 | data(:,2)==1) & abs(data(:,1)-data(:,2))<=2 )
data(row_indices,:)
于 2013-09-13T00:50:44.707 回答