6 Stimmen

Suche und ersetze die Reihen eines Arrays, die eine wiederholte Zahl haben, durch eine festgelegte Zeile.

Ich habe eine Matrix mit Zeilen, die sich wiederholende Zahlen enthalten. Ich möchte diese Zeilen finden und durch eine Dummy-Zeile ersetzen, um die Anzahl der Zeilen der Matrix konstant zu halten.

Dummy_row = [1 2 3]

(5x3) Matrix A

A = [2 3 6;
     4 7 4;
     8 7 2;
     1 3 1;
     7 8 2]

(5x3) Matrix new_A

new_A = [2 3 6;
         1 2 3;
         8 7 2;
         1 2 3;
         7 8 2]

Ich habe Folgendes versucht, das die Zeilen mit wiederholten Zahlen gelöscht hat.

y = [1 2 3]
w = sort(A,2)
v = all(diff(t,1,2)~=0|w(:,1:2)==0,2)  % Wenn v null ist, enthält die Zeile wiederholte Zahlen
z = A(w,:)

Können Sie bitte helfen?

3voto

Rashid Punkte 4298

Schau, ob das für dich funktioniert,

A= [ 2 3 6;
     4 7 4;
     8 7 2;
     5 5 5;
     1 8 8;
     1 3 1;
     7 8 2 ];
Dummy_row = [1 2 3];
b = diff(sort(A,2),1,2);
b = sum(b == 0,2);
b = b > 0;
c = repmat(Dummy_row,sum(b),1);
b = b' .* (1:length(b));
b = b(b > 0);
newA = A; 
newA(b,:) = c;

ergibt,

newA =
 2     3     6
 1     2     3
 8     7     2
 1     2     3
 1     2     3
 1     2     3
 7     8     2

Bearbeiten

Nicht viel Änderung ist erforderlich, versuche das hier,

Dummy_row = [1 2 3];
b = sum(A == 0,2);
b = b > 0;
c = repmat(Dummy_row,sum(b),1);
b = b' .* (1:length(b));
b = b(b > 0); 
newA = A; 
newA(b,:) = c;

3voto

Divakar Punkte 211985

bsxfun basierte Lösung -

%// Erstellen einer Zeilenmaske der Elemente, die bearbeitet werden sollen
mask = any(sum(bsxfun(@eq,A,permute(A,[1 3 2])),2)>1,3);

%// Ausgabevaiable einrichten und zu bearbeitende Zeilen als Kopien von [1 2 3] festlegen
new_A = A;
new_A(mask,:) = repmat(Dummy_row,sum(mask),1)

Codeausführung -

A =
     2     3     6
     4     7     4
     8     7     2
     1     3     1
     7     8     2
new_A =
     2     3     6
     1     2     3
     8     7     2
     1     2     3
     7     8     2

3voto

knedlsepp Punkte 5923

Sie könnten Folgendes verwenden:

hasRepeatingNums = any(diff(sort(A, 2), 1, 2)==0, 2); 
A(hasRepeatingNums,:) = repmat(Dummy_row, nnz(hasRepeatingNums), 1);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X