2016-05-03 12 views
1

In Octave, ich habe diese Zellenfeld: y = { 'hello' 'world' 'a' 'world' 'g' 'I' 'w' 'hi'};Octave - entfernen Vorkommen eines Elements in einem Zellenfeld

Ich brauche die Duplikate eines Elements entfernen zu können. So zum Beispiel habe ich die Duplikate von 'world' entfernen möchten, sollte dies der Ausgang sein:

ans = 
{ 
    [1,1] = hello 
    [1,2] = a 
    [1,3] = g 
    [1,4] = I 
    [1,5] = w 
    [1,6] = hi 
} 

Abgesehen von der üblichen Schleife bis n-mal, gibt es eine Funktion in Octave, das dies tut?

Ich habe nach Möglichkeiten gesucht, dies zu tun, aber nichts gefunden. Von dem, was ich gesehen habe, macht unique dies nicht, da es alle Duplikate entfernt.

+0

Sie haben * alle * Vorkommen von 'world' entfernt, ist das wirklich was Sie wollten? – Suever

+0

@ CH123: Ist die Reihenfolge des Ergebnisses wichtig? Und möchten Sie mehrere Duplikate entfernen? Zum Beispiel 'y = {" foo "," Hallo "," Bar "," Baz "," Hallo "," Welt "," Foo "}' sollte Hallo und Foo entfernen? – Andy

+0

@Suever, ja Ich möchte alle Instanzen von "Welt" entfernen. @Andy, die Reihenfolge ist nicht wichtig (so ist es in Ordnung, wenn es ein Array mit einer aufsteigenden Reihenfolge wie 'unique' zurückgibt). Und mehrere Duplikate sind auch in Ordnung, aber überhaupt nicht notwendig. – CH123

Antwort

1

Wenn Sie alle Vorkommen einer Zeichenfolge aus einem Zellenarray entfernen möchten, wie Sie in Ihrem Beispiel gezeigt haben, können Sie einfach strcmp verwenden.

x = y(~strcmp(y, 'world')); 

%// { 
%//  [1,1] = hello 
%//  [1,2] = a 
%//  [1,3] = g 
%//  [1,4] = I 
%//  [1,5] = w 
%//  [1,6] = hi 
%// } 

Und dies kann leicht angepasst werden, wenn man sich mehrere Paare von Duplikate entfernen möchten, wenn Sie ismember verwenden können.

y = {'a', 'a', 'b', 'b', 'c', 'c'}; 
x = y(~ismember(y, {'a', 'b'}); 

Wenn Sie stattdessen alle bis auf das erste Vorkommen einer Zeichenfolge entfernen möchten, können Sie Folgendes tun:

toremove = find(strcmp(y, 'world')); 
x = y; 
x(toremove(2:end)) = []; 

%// x = 
%// { 
%//  [1,1] = hello 
%//  [1,2] = world 
%//  [1,3] = a 
%//  [1,4] = g 
%//  [1,5] = I 
%//  [1,6] = w 
%//  [1,7] = hi 
%// } 
+0

Oh. Ich wusste nicht, dass 'strcmp' das kann. Das habe ich gebraucht. Vielen Dank! – CH123

+0

Nur eine Frage, was ist '~' für in 'x = y (~ strcmp (y, 'Welt'));'? – CH123

+1

@ CH123 Weil Sie alle Werte, die * nicht * sind, behalten möchten. Das '~' negiert das logische Array, das 'strcmp' zurückgibt. – Suever

1

Wenn Sie Elemente automatisch zu entfernen, mit mehrfach auftreten verwenden:

y = { 'hello' 'world' 'a' 'world' 'g' 'I' 'w' 'hi'}; 
[Y, ~, J] = unique (y); 
cnt = accumarray (J(:), 1); 
Y(cnt == 1) 

ans = 
{ 
    [1,1] = I 
    [1,2] = a 
    [1,3] = g 
    [1,4] = hello 
    [1,5] = hi 
    [1,6] = w 
} 

cnt zählt das Auftreten jeder Saite so Y (cnt == 1) nur Zeichenketten enthält, die genau occure Einmal.

Verwandte Themen