在MATLAB中,如何以最有效的方式比较2个向量的元素?

时间:2018-02-15 15:03:37

标签: matlab

我有一个向量 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];

实现这一目标的有效方式(即理想情况下通过避免循环)是什么?感谢。

2 个答案:

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