我有一个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 A8
中point1
的行索引分别为AIdx == 1
和AIdx == 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)
出现问题。
答案 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;