如何比较满足条件的向量和矩阵列?

时间:2017-06-24 05:58:20

标签: matlab vector compare

我有一个12x3矩阵:

point1 = [7.5   4   5
          8.5   4   5
         9.5    4   5
         10.5   4   5
         11.5   4   5
         7      4   5.5
         12     4   5.5
         6.5    4   6
        12.5    4   6
           6    4   6.5
          13    4   6.5
         5.5    4   7];

在某些程序后,从point1获得以下两个载体。

A1 = [7.5,4,5]; 
A8 = [6.5,4,6];

A1 and A8point1的行索引分别为AIdx == 1AIdx == 8

我想要的是比较两个A1 and A8,看看它们中哪一个(或可能两者)在与第6行point1 相同的列中具有非整数。

我尝试过以下代码:

AIdx = find(ismember(point1, vertcat(A1, A8), 'rows'));

    for ii = 1: numel(AIdx)

    % In case where a close point is found, compare if they are both in the same plane
    if isequal( mod(point1(AIdx(ii),:),1)~=0, mod(point1(6,:),1)~=0 )== true    
        point1(AIdx(ii),:) = [NaN,NaN,NaN];  %invalidate all AIdx in the same plane as point1

    elseif isequal( mod(point1(AIdx(ii),:),1)~=0, mod(point1(6,:),1)~=0 )== false   
        AIdx(ii,:) = [];
    end
end

但是,我收到错误消息:“索引超出矩阵尺寸。”我感觉这是来自零件

mod(Point1(AIdx(ii),:),1) 

ii = 2 (hence AIdx=8)出现问题。

1 个答案:

答案 0 :(得分:1)

首先关于您的错误消息:

在第一次迭代中,您删除了elseif部分中的AIdx(1,:)。因此AIdx之后只剩下一个元素,导致AIdx(2)抛出所述错误。首先,那部分的目的是什么?

现在关于你的比较:

仅当所有非整数位于同一位置时才会出现。除非我对这个问题有很大的误解,否则你想检查一个非整数是否在同一个地方。

for ii = 1: numel(AIdx)
    if any((mod(point1(AIdx(ii),:),1)~=0) & (mod(point1(6,:),1)~=0)) % check if ANY non integer is at the same place
        point1(AIdx(ii),:) = NaN;
    end
end

此外,这是一个没有循环的版本:

nonIntSix = repmat((mod(point1(6,:),1)~=0),2,1); % get indices of non integers in row six
NonIntA = mod(point1(AIdx,:),1)~=0; % same for A1 and A8
point1(AIdx(max(nonIntSix&NonIntA,[],2)),:) = NaN; % NaN all rows where at least one element the same

或单线(更快):

point1(AIdx(max((mod(point1(AIdx,:),1)~=0) & (repmat((mod(point1(6,:),1)~=0),2,1)),[],2)),:) = NaN;