Matlab:如何基于行函数有条件地选择矩阵的子集?

时间:2013-09-13 00:42:25

标签: matlab matrix subset

我有一个这样的矢量,表示电路板上的水平/垂直尺寸

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循环可以做到这一点吗?

2 个答案:

答案 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