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

Matrix sortieren, doppelrte Einträge entfernen - wie?!

 

gorila
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 23.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2008, 17:40     Titel: Matrix sortieren, doppelrte Einträge entfernen - wie?!
  Antworten mit Zitat      
Hallo, ich bin ein ziemlicher Matlab neuling und bin hier am verzweifeln.


ich habe eine Matrix aus zwei spalten.

in der ersten Spalte stehen Namen, die sich wiederholen.

in der zweiten Spalte stehen die Zahlen die die Codes für die Namen darstellen.

also

Name1 Zahl1
Name1 Zahl1
Name3 Zahl3
Name3 Zahl3
Name2 Zahl2
Name2 Zahl2


usw.

wie kann ich in dieser Matrix die wiederholungen rausnehmen? Und zwar so, dass die Zahlen zugehörigkeit nicht verändert wird.

zB:

Name1 Zahl1
Name2 Zahl2
Name3 Zahl3


ich hoffe ihr könnt mir helfen
Private Nachricht senden Benutzer-Profile anzeigen


josekamara
Forum-Meister

Forum-Meister


Beiträge: 529
Anmeldedatum: 26.04.08
Wohnort: München
Version: ---
     Beitrag Verfasst am: 23.11.2008, 18:24     Titel:
  Antworten mit Zitat      
Hallo,

probier dies mal,

Code:
wiederholung = [];

for i = 1:length(matrix(:,1))
    for j=i+1:length(matrix(:,1))

        if strcmp(matrix(i,1),matrix(j,1))
            wiederholung(end+1)=j;
            matrix(j,:) = [];
        end
    end
end


Edit by Bijick: Code-Umgebung repariert (und Doppelpostings gelöscht). Zum Einfügen von Code klickt man erst auf den Button "Code", dann tippt man den Text und klickt abschließend nochmals auf "Code". Smile
_________________

Simulation
Private Nachricht senden Benutzer-Profile anzeigen
 
gorila
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 23.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2008, 19:13     Titel:
  Antworten mit Zitat      
Also im Moment kämpfe ich damit, diese Matrix zu bekommen. Irgendwie geht gar nichts.

Es ist ein gescannter text.

unter dem Strich erhalte ich zwei Vektoren der Form (n,1) verpackt in zwei Zellen einer "data" matrix der Form, sagen wir, [1,2] als Cell Array.

erster Vektor entählt Namen und wurde als string gescant

zweite Vektor enthält Nummer und wurde als double gescant.

die Idee ist, ich mache daraus letztendlich meine Matrix, nennen wir sie, "Liste" die aus zwei Reihen der obigen Vektoren besteht.

also:

liste = [data{1}, data{2}];

und das klapt nicht, weil data{1} und data{2} verschiedene Dimensionen haben.

Das erste hat einen Cell,

das zweite einen Double

liegts an dem?

wie kann ich das umgehen?


wenn ich das zusammenkleben könnte, dann könnte ich mit

zunächst cell2mat eine "normale" matrix generieren und mit

unique 'rows'

das erreichen was ich will. weil unique mit cell arrays nicht funktioniert, sondern nur mit normalen Matrizen.

please help
Private Nachricht senden Benutzer-Profile anzeigen
 
hadi
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 06.08.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2008, 19:46     Titel:
  Antworten mit Zitat      
Hallo!
Hab ich das mit der Matrix richtig verstanden? Du hast z.B.

Code:

data{1}={'Hans';'Hans';'Max';'Hans';'Tom';'Max';'Johann'}; %cell array mit namen
data{2}=[1;1;2;1;3;2;4]; %double array mit zahlen[

Richtig?
Dann kannst du das so machen:

Code:
data{1}={'Hans';'Hans';'Max';'Hans';'Tom';'Max';'Johann';'Johann'}; %cell array mit namen
data{2}=[1;1;2;1;3;2;4;4]; %double array mit zahlen


deleteItems=zeros(size(data{1})); %wenn Eintrag==0: nicht löschen; wenn Eintrag==1: löschen
for count1=1:length(data{1})-1 %alle bis vor den letzten Eintrag durchlaufen
    for count2=count1+1:length(data{1}) %alle NACH dem Eintrag #count1 durchlaufen
        if strcmpi(data{1}(count1),data{1}(count2)) && data{2}(count1)==data{2}(count2)
            deleteItems(count2)=1; %Eintrag zum Löschen markieren
        end
    end
end

data{1}(deleteItems==1)=[]; %Löschen
data{2}(deleteItems==1)=[];


data{1},data{2}


Dann kommt raus:

Code:
ans =

    'Hans'
    'Max'
    'Tom'
    'Johann'


ans =

     1
     2
     3
     4

Schöne Grüße, Hadi
Private Nachricht senden Benutzer-Profile anzeigen
 
raphw
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.11.08
Wohnort: ---
Version: Matlab R2010a
     Beitrag Verfasst am: 23.11.2008, 19:54     Titel:
  Antworten mit Zitat      
Warum nicht einfach?

[a,b,c] = unique(foo);
x = [];

for i=1:length(b)
x = [x;foo(b)];
end

sollte aufs gleiche kommen, nur deutlich schneller...
Private Nachricht senden Benutzer-Profile anzeigen
 
gorila
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 23.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2008, 20:13     Titel:
  Antworten mit Zitat      
Ich sollte vlt noch sagen, dass es nicht 3 zeilen sind, sondern 70.000

aber den Aufbau habt ihr korrekt verstanden=)

wie wird unique(foo) eingebaut?

"foo" ist bei mir nicht definiert
Private Nachricht senden Benutzer-Profile anzeigen
 
raphw
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 12.11.08
Wohnort: ---
Version: Matlab R2010a
     Beitrag Verfasst am: 24.11.2008, 11:59     Titel:
  Antworten mit Zitat      
unique ist tatsächlich deine gesuchte funktion, foo ist nur der name deiner matrix in matlab. nenn sie von mir aus data oder matrix, es ist egal.

a,b,c,x und i kannst du ebenfalls benennen wie du willst (sie werden bei programm-durchlauf definiert), sie sind lediglich platzhalter.
viel erfolg!
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 - 2024 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.