2017-06-24 1 views
0

Iは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]; 

point1におけるそれぞれA1 and A8の行インデックスはAIdx == 1AIdx == 8あります。

A1 and A8の両方を比較して、の第6行と同じ列に非整数を持つかどうかを確認してください。

私は、次のコードを試してみました:と私は、これは一部

mod(Point1(AIdx(ii),:),1) 
から来ている感じを持っている「インデックスは、行列の次元を超えています。」:

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 

はしかし、私は、エラーメッセージが表示されます

ii = 2 (hence AIdx=8)には問題があります。あなたはELSEIF部分にAIdx(1,:)を削除する最初の繰り返しで

:あなたのエラーメッセージについてまず

答えて

1

。従って、AIdxは、後で1つの要素しか残さず、AIdx(2)に前記エラーがスローされる。最初にその部分の目的は何でしたか?あなたの比較について今

ALL非整数が同じ場所にある場合にのみ真です。私が質問を誤解していない限り、あなたは1つの非整数が同じ場所にあるかどうかをチェックしたいと思っていました。

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; 
+0

は、それが動作するようになりました。私は '' elseif ''の後に' Aidx'を削除する必要はなかったと思う。どうもありがとうございます! – User1772

関連する問題