我有一个向量 r ,它存储以前执行的操作。让,
r=[8,8,8,2,2,6,6, ... , 4,4,4]; % (8:up, 2:down, 4:left, 6:right)
我有第二个向量操作,表示当前可用的操作。让,
actions=[2,6,8];
[~,n]=size(actions);
并让 n 表示可用操作的数量。我想将vector r 的 last n 元素与vector actions 的元素进行比较,并消除当前相反方向的操作,即避免重复。
例如,因为在这种情况下,向量 r 表示最后一个操作朝向左,所以在向量操作中应该删除6并且结果将是
actions=[2,8];
实现这一目标的有效方式(即理想情况下通过避免循环)是什么?感谢。
答案 0 :(得分:4)
我将使用oposite动作定义一个数组,在这种情况下将是
oposite=[0 8 0 6 0 4 0 2]% (8:up, 2:down, 4:left, 6:right)
然后,要从动作中移除已经使用过的n,你只需使用bsxfun对相等函数进行单例扩展,这样就可以执行以下操作:
actions(any(bsxfun(@eq,oposite(actions)',r(end-n+1:end)),2))=[];
就是这样,只有一行'oposite'被定义。
答案 1 :(得分:0)
我通过定义一个保持相反动作对的矩阵来解决它。然后获取r
的最后一个n-unqiue值,并从actions数组中删除它的pair
。
pairs = [2 8;...
8 2; ...
4 6; ...
6 4];
r=[8,8,8,2,2,6,6,4,4,4];
actions=[2,6,8];
[~,n]=size(actions);
%The unique last n-values of r
lastN_r = unique(r(end-n+1:end));
%Where these are in the pairs matrix
matchI = ismember(pairs(:,1),lastN_r);
%Remove them.
parsedAct = actions(~ismember(actions,pairs(matchI,2)))
parsedAct =
2 8