2017-06-24 7 views
0

Ich habe eine 12x3 matrix:Wie vergleiche ich Vektor- und Matrixspalten, die eine Bedingung erfüllen?

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

Die folgenden beiden Vektoren aus point1 nach bestimmten Verfahren erhalten wurden.

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

die Zeilenindizes A1 and A8 jeweils in point1 sind AIdx == 1 und AIdx == 8.

Was ich möchte, ist sowohl von A1 and A8 zu vergleichen, wer von ihnen (oder möglicherweise beide) eine nicht-ganze Zahl in der gleichen Spalte wie die 6. Reihe von point1 zu sehen.

Ich habe den folgenden Code versucht:

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 

Allerdings erhalte ich die Fehlermeldung: „Index Matrix Dimensionen übersteigt.“ und ich habe das Gefühl, das aus dem Teil kommt

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

wobei bei ii = 2 (hence AIdx=8) ein Problem auftritt.

Antwort

1

zuerst über Ihre Fehlermeldung:

In der ersten Iteration Sie AIdx(1,:) im elseif Teil löschen. Daher hat AIdx hinterher nur noch ein Element übrig, das AIdx(2) führt, um den Fehler zu werfen. Was war der Zweck dieses Teils in erster Linie?

jetzt über Ihren Vergleich:

Es ist nur wahr, wenn alle nicht ganze Zahlen am gleichen Ort sind. Wenn ich die Frage nicht sehr missverstanden habe, wollten Sie prüfen, ob auch EINER Nicht-Integer am selben Ort ist.

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 

Auch hier ist eine Version ohne Schleife:

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 

oder als Einzel Liner (schneller):

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

Es funktioniert jetzt. Ich sehe, dass ich 'Aidx' nach dem' "elseif" 'nicht löschen musste. Ich danke dir sehr! – User1772

Verwandte Themen