WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Location von unique Zeilen

 

umutos
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 07.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2010, 18:18     Titel: Location von unique Zeilen
  Antworten mit Zitat      
Hallo,

Wie finde ich die location von Zeilen in einer Matrix, die nicht doppelt vorkommen, d.h. kein Duplikat haben? D.h. ein Vektor der mir sagt dass Zeilen 2,4,7 und 8 unique sind und nicht mehrmals vorkommen.

Danke!

Bernd
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 10.05.2010, 12:47     Titel:
  Antworten mit Zitat      
Hi,

Code:

A=[1,1,1,2,2,2,4,4,4,5,5,6]
[a,b]=unique(A)
 


b ist dann was du suchst.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 10.05.2010, 14:20     Titel:
  Antworten mit Zitat      
Hallo
so was in der Art:
Code:

A =[3,4,2; 2,2,1; 2,2,1; 0,0,0; 1,0,2; 0,-1,2; 2,2,1]
num_rows = size(A,1);

B = false(num_rows)

for k=1: num_rows-1

  for m= k+1:num_rows
    if isequal(A(k,:),A(m,:))
       B(k,m)=true;
       B(m,k)=true;
    end
  end
end

B = sum(B,2)

find(~B)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
umutos
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 07.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2010, 14:24     Titel:
  Antworten mit Zitat      
Hallo Oli,

Danke für die Antwort aber ich glaube du hast da was missverstanden:

1. Ich suche nach Zeilen in einer Matrix und nicht in einem Vektor. Ich hab mir überlegt dass man vielleicht die Zeilen in der Matrix miteinander addieren kann, aber dann kommt es vor dass die Summe von 2 zeilen die gleiche ist obwohl die einzelnen Spalten unterschiedlich sind.

2. Wo sehe ich in b ob eine Zeile doppelt vorkommt? b sagt mir doch nur, an welcher Position zum letzten mal die entsprechende Zeile vorkommt D.h in deinem Beispiel sagt mir der Vektor b:

Code:

b =

     3     6     9    11    12


z.B. dass ein "2er" in der 6ten Zeile vorkommt, nicht aber ob der 2 er sonst noch vorkommt und wo sonst noch vorkommt. und ich will ja wissen wo die doppelten für jede einzelne Zeile sind.
Es wär mir auch schon geholfen wenn ich alle Zeilen die keinen doppelten haben (bei dir wäre es der 6 er in der 12 ten Zeile) löschen kann.

Danke für die Hilfe!
Bernd
Private Nachricht senden Benutzer-Profile anzeigen
 
quant82
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 30.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2010, 14:38     Titel:
  Antworten mit Zitat      
du könntest aber die matrix transponieren und dann die spalten in vectoren schieben...
Private Nachricht senden Benutzer-Profile anzeigen
 
umutos
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 07.05.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.05.2010, 19:16     Titel:
  Antworten mit Zitat      
Hallo Denny,

Danke für den Vorschlag. Der ist super, nur leider kann ich den Code nicht auf meinen Datensatz anwenden. Mein Datensatz hat mehr als 1 Mio Zeilen und ich kann daher x= false (a x a) nicht anwenden (1 mio x 1 mio ist zuviel für matlab). ich hab den Code den du geschrieben hast leicht umgeschrieben damit es dann auch funktioniert:

Code:

A =[3,4,2; 2,2,1; 2,2,1; 0,0,0; 1,0,2; 0,-1,2; 2,2,1]
num_rows = size(A,1);
B(:,1)=1:num_rows;
B(:,2)=false(num_rows,1);
for k=1: num_rows-1
  for m= k+1:num_rows
    if isequal(A(k,:),A(m,:))==true
       B(k,2)=true;
       B(m,2)=true;
    end
  end
end

find(B(:,2)==false)
 

Dieser Code funktioniert zwar gut, aber nur wenn num_rows kleiner als 5000 ist. Danach hängt er sich auf. Kann ich das irgendwie umgehen?Den Datensatz in kleine Teile zerlegen würd das Problem auch nicht gleich lösen da ja z.B. die doppelten der ersten Zeile im letzten Abschnitt vorkommen könnten.
Ich habe auch den Versuch gestartet auf eine der beiden Schleife zu verzichten aber leider funktioniert der Befehl
Code:

nicht bzw. Es kommt immer false raus.
Wie schon in der vorherigen Nachricht geschrieben muss ich es „nur“ schaffen die nicht doppelt vorkommenden Zeilen zu löschen. Dann würde sich mein Datensatz erheblich verkleinern und ich kann wieder richtig damit arbeiten. Sitze schon seit vielen Wochen vor diesem „kleinen“ Problem und komme einfach nicht weiter. Bin schon am verzweifeln.
Danke nochmals für die Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.05.2010, 14:15     Titel:
  Antworten mit Zitat      
Hallo

komplett auf Schleifen zu Verzichten wird wohl nicht klappen:
kann dir noch folgenden Vorschlag unterbreiten,
das dauert

Code:

A = round(rand(10000,3)*10);
[num_rows,num_cols] = size(A);

str = sprintf('A(:,%d)==A(k,%d) & ',vertcat(1:num_cols,1:num_cols))
str = [ str(1:end-2),';']

pos=0;
for k=1: num_rows
  tmp_str   = sprintf('Please wait... compare %6d/%d', k, num_rows);
  fprintf('%s',tmp_str)
  pos = pos + eval(str);
  fprintf('%s',char(sign(tmp_str)*8));
end

find(pos==1)
 


das die optimierte Lösung
Code:

A = round(rand(100,3)*10);
[num_rows,num_cols] = size(A);

str = sprintf('A(:,%d)==A(k,%d) & ',vertcat(1:num_cols,1:num_cols))
str = [ str(1:end-2),';']

pos = false(num_rows,1);
run_mat = ~pos;
while any(run_mat)
  k = find(run_mat,1);
  tmp_str   = sprintf('Please wait... compare %6d/%d', k, num_rows);
  fprintf('%s',tmp_str)
  tmp_pos = eval(str);
  if sum(tmp_pos)==1
     pos = pos | tmp_pos;
  end
  run_mat = run_mat - tmp_pos;
  fprintf('%s',char(sign(tmp_str)*8));
end

find(pos==1)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 11.05.2010, 16:28     Titel:
  Antworten mit Zitat      
Kleiner Nachtrag:
ISEQUAL vergleicht nicht nur Elemente sondern auch Dimension von Arrays.
Wenn Dimensionen von Arrays unterschiedlich ist, kommt immer FALSE raus

Deswegen kriegst bei diesem Vergleich FALSE: weil Matrix ist m x n während Array m x 1 ist.
Code:


stattdessen ist BSXFUN besser
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.