2014-12-14 8 views
6

Ich habe eine Matrix mit Zeilen mit sich wiederholenden Zahlen. Ich möchte diese Zeilen finden und sie durch eine Dummy-Zeile ersetzen, um die Anzahl der Zeilen der Matrix konstant zu halten.Suchen und ersetzen Sie die Zeilen eines Arrays mit wiederholter Nummer durch eine feste angegebene Zeile

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] 

habe ich versucht, die folgenden, die die Zeilen mit wiederholten Zahlen gelöscht.

y = [1 2 3] 
w = sort(A,2) 
v = all(diff(t,1,2)~=0|w(:,1:2)==0,2) % When v is zero, the row has repeated numbers 
z = A(w,:) 

Können Sie bitte helfen?

+0

Wie dieser Code so modifiziert werden kann, dass sie auch alle Zeilen ersetzt mindestens eine Null aufweist, der Dummy_row? –

Antwort

3

bsxfun basierend Lösung n -

%// Create a row mask of the elements that are to be edited 
mask = any(sum(bsxfun(@eq,A,permute(A,[1 3 2])),2)>1,3); 

%// Setup output variable and set to-be-edited rows as copies of [1 2 3] 
new_A = A; 
new_A(mask,:) = repmat(Dummy_row,sum(mask),1) 

Code ausführen -

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 
+1

Sehr schöne Divakar – Rashid

+0

Einziger Nachteil: Sie müssen immer noch 'sort (A, 2)' verwenden, um dies zu Matrizen mit mehr als 3 Spalten zu verallgemeinern. – knedlsepp

+1

@knedlsepp Sie müssen dummy_row '[1 2 3]' dafür bearbeiten, der Rest des Codes bleibt gleich. – Divakar

3

sehen, ob dies für Sie arbeitet,

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; 

gibt,

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 erforderlich ist, versuchen Sie dies,

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

Ich habe auf dich gewartet. Anspruchsvoll! +1 – mehmet

+0

Es funktioniert! Vielen Dank Mehmet. –

+0

Danke @Kamtal! Wie kann dieser Code so geändert werden, dass er auch Zeilen mit mindestens einer Null mit Dummy_row ersetzt? –

3

Sie könnten die Verwendung folgende:

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

Dies könnte der schnellste sein! – Divakar

+0

Ja definitiv! Vielen Dank Divakar. –

+0

Danke @knedlsepp! Wie kann ich diesen Code so ändern, dass er auch Zeilen mit mindestens einer Null mit Dummy_row ersetzt? –

Verwandte Themen