我有一个这样的矢量,表示电路板上的水平/垂直尺寸
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循环可以做到这一点吗?
答案 0 :(得分: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,:)
答案 1 :(得分: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
函数计算Manhattan distance。