0

ボード上の水平/垂直寸法を表すこのようなベクトルがあります

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

(1, 1) の開始ベクトルもあります。水平方向 == 1 で垂直方向が +-2 単位離れている、または垂直方向 == 1 で水平方向 = +-2 であるこのマトリックスのすべての行をサブ選択したいと考えています。

一度に 2 つのスペースを移動するように制限されているミニ 4x4 チェス盤のルークのように考えてください。一連の提案されたスペースから移動できるすべての有効なスペースを見つけたいのですが、提案のいくつかが複数回存在しても問題ありません。それらは異なる人によって提案されているからです。

私は提案のサブセットが欲しい

[ (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 に答える