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

String-Cells vergleichen

 

geieraffe
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2012, 15:29     Titel: String-Cells vergleichen
  Antworten mit Zitat      
Hallo,
ich habe 2 Cells die jeweils Strings enthalten (Dateinamen).
Jetzt hätte ich gerne nur die, die deckungsgleich sind.

ich habe schon eine weile gesucht und bin auf SETDIFF() gestoßen,
allerdings funktioniert das nicht ganz, weil meine Strings nicht identisch sind:
Cell A:
'file_name_2012_xxx.xxx'
Cell B:
'file_name_2012'

das sei nur ein Beispiel ...

gibt es eine Möglichkeit diese Cells abzugleichen ohne in Schleifen die Strings in Cell A erst in Tokens aufzuspalten und dann zu vergleichen?

Achja STRCMP() funktioniert auch nicht, weil die Strings vor "_xxx.xxx" nicht immer gleich lang sind.

Ich hoffe das war einigermaßen verständlich erklärt Smile

Vielen Dank schonmal!
Private Nachricht senden Benutzer-Profile anzeigen


flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.06.2012, 16:33     Titel:
  Antworten mit Zitat      
Benutze reguläre Ausdrücke um zu vergleichen, ggf können die deal und cellfun dabei ebenso helfen
Private Nachricht senden Benutzer-Profile anzeigen
 
geieraffe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 08:07     Titel:
  Antworten mit Zitat      
hmm, ich weiß nicht ganz wie.

leider hilft mir das nicht beim "abschneiden" der Strings ...


momentan hab ich es jetzt so gelöst:
Code:

    l = length(dataset_namesA{1});
    for i=1:length(dataset_namesB)
        dataset_namesB{i} = dataset_namesB{i}(1:l);
    end;
    %all_dataset_names = dataset_namesA;
    dataset_namesA = intersect(dataset_namesA,dataset_namesB);
 


aber ich kann eben leider nicht 100%ig davon ausgehen, dass die Strings in dataset_namesA immer alle gleich lang sind.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.06.2012, 08:35     Titel: Re: String-Cells vergleichen
  Antworten mit Zitat      
Hallo geieraffe,

Bitte gib ein konktretes Beispiel an, welches die erforderlichen Details enthält.
Eine Schleife und STRNMCP (nicht STRCMP!) ist wahrscheinlich effizient und übersichtlich.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
geieraffe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 09:47     Titel:
  Antworten mit Zitat      
ok hier mal ein Bsp.:

Code:

dataset_names = {2012_06_01_AA;
                            2012_06_01_AB;
                            2012_06_01_AAB;
                            2012_06_01_ABA;
                            ...;
                            2012_06_01_DDB};

dir_names = {2012_06_01_AA_dumb.mat;
                     2012_06_01_AB_dumb.mat;
                     2012_06_01_AAB_dumb.mat;
                     2012_06_01_ABA_dumb.mat;
                     ...;
                     2012_06_01_DDB_dumb.mat};
 



Momentan löse ich das so:
Code:

    l = length(dataset_names{1});
    for i=1:length(dir_names)
        dir_names{i} = dir_names{i}(1:l);
    end;

dataset_names = intersect(dataset_names,dir_names);
 


aber schon mit dem oben erwähnten Beispiel geht das schief, weil nicht alle Strings die Länge des ersten Eintrags haben und '2012_06_01_AAB_dumb.mat' und '2012_06_01_AA_dumb.mat' beide auf '2012_06_01_AA' "abgeschnitten werden".
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 14.06.2012, 10:21     Titel:
  Antworten mit Zitat      
Hallo geieraffe,
du könntest auch findstr nutzen.

Beispiel
Code:

a = {'file_name_2012_xxx.xxx'};
b = {'file_name_2012'};
findstr(b{:}, a{:})
 


Wenn du eine Zahl zurück bekommst, weißt du dass der string enthalten ist.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
geieraffe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.06.2012, 13:31     Titel:
  Antworten mit Zitat      
_Peter_ hat Folgendes geschrieben:
Hallo geieraffe,
du könntest auch findstr nutzen.

Beispiel
Code:

a = {'file_name_2012_xxx.xxx'};
b = {'file_name_2012'};
findstr(b{:}, a{:})
 


Wenn du eine Zahl zurück bekommst, weißt du dass der string enthalten ist.


muss ich dabei aber nicht beide Cells auch wieder in 2 Schleifen durchlaufen? Das will ich näml vermeiden, sonst könnt ich ja auch die Cell mit den längeren Strings einmal durchlaufen, sie mit Hilfe von "_" in tokens zerlegen, neu zusammensetzten ... dann hab ich ja die exakten Namen.
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 15.06.2012, 06:46     Titel:
  Antworten mit Zitat      
Oh... das Detail ohne Schleife hat mein Hirn übersehen... dann würde ich das wie vorgeschlagen mit regexp lösen:

Code:

c_a = {'file_name_2012_xxx.xxx', 'file_name2_2012_xxx.xxx'};
c_b = {'file_name_2012', 'file_name3_2012'};

regexp(c_a, c_b, 'match', 'once')
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
geieraffe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2012, 08:47     Titel:
  Antworten mit Zitat      
Hallo Peter,

vielen Dank für den Vorschlag, aber das geht so leider nicht Sad
Code:

K>> aa_res = regexp(curSigDirNames, dataset_names,'match', 'once');
??? Error using ==> regexp
Multiple strings and patterns given to regexp must have the same quantity.
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.06.2012, 09:14     Titel:
  Antworten mit Zitat      
Hallo geieraffe,

Es ist praktischer, wenn Du für Code-Beispiele die regulaäre Matlab-Syntax verwendest. Ich gehe davon aus, dass in der Cell noch Quotes um die Strings eingefügt werden müssen. Das ist zwar nur eine Kleinigkeit, aber es ist effizienter, wenn der Fragesteller dies erledigt, und nicht jeder Anwtortende.

Es fehlt noch eine Erklärung, was Du als Ausgabe wünschst. Was genau soll passieren, wenn Du nach "AA" suchst und die Strings "AA" und "AAB" vorhanden sind? Folgt in den Namen immer ein Underscore, so dass man eigentlich nach "AA_" suchen könnte?

Code:

dataset_names = {'2012_06_01_AA'; ...
                            '2012_06_01_AB'; ...
                            '2012_06_01_AAB'; ...
                            '2012_06_01_ABA'; ...
                            '2012_06_01_DDB'};

dir_names = {'2012_06_01_AA_dumb.mat'; ...
                     '2012_06_01_AB_dumb.mat'; ...
                     '2012_06_01_AAB_dumb.mat'; ...
                     '2012_06_01_ABA_dumb.mat'; ...
                     '2012_06_01_DDB_dumb.mat'};

% Lösung 1:
Cut1 = strrep(dir_names, '_dumb.mat', '');
index = intersect(dataset_names, Cut1);

% Lösung 2:
App1 = strcat(dataset_names, '_');
match = false(size(dataset_names));
for i = 1:numel(match)
  aName = dataset_names{i};
  match(i) = any(strncmp(dir_names, aName, length(aName)));
end

Je präziser eine Problem formuliert ist, desto leichter ist die Lösung.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 15.06.2012, 09:37     Titel:
  Antworten mit Zitat      
geieraffe hat Folgendes geschrieben:
Hallo Peter,

vielen Dank für den Vorschlag, aber das geht so leider nicht Sad
Code:

K>> aa_res = regexp(curSigDirNames, dataset_names,'match', 'once');
??? Error using ==> regexp
Multiple strings and patterns given to regexp must have the same quantity.
 


Dann müsstest du mal zeigen, wie du das gemacht hast.
Wenn ich dein Beispiel durchlaufen lasse:
Code:

>> dataset_names = {'2012_06_01_AA'; ...
                            '2012_06_01_AB'; ...
                            '2012_06_01_AAB'; ...
                            '2012_06_01_ABA'; ...
                            '2012_06_01_DDB'};
dir_names = {'2012_06_01_AA_dumb.mat'; ...
                     '2012_06_01_AB_dumb.mat'; ...
                     '2012_06_01_AAB_dumb.mat'; ...
                     '2012_06_01_ABA_dumb.mat'; ...
                     '2012_06_01_DDB_dumb.mat'};
>> regexp(dir_names, dataset_names, 'match', 'once')
ans =
    '2012_06_01_AA'
    '2012_06_01_AB'
    '2012_06_01_AAB'
    '2012_06_01_ABA'
    '2012_06_01_DDB'
 


Dann funktionier das ohne Probleme...
Oder du versuchst den Vorschlag von Jan.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
geieraffe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2012, 09:38     Titel:
  Antworten mit Zitat      
Sorry wenn ich mich ungenau ausgedrückt habe, das ist natürlich keine Absicht.
Und ja, du hast natürlich recht, da sollten noch qutes sein. hab ich beim schnellen Abtippen wohl vergessen, da diese im Workspace Editor ja nicht angezeigt werden.

Jan S hat Folgendes geschrieben:
Folgt in den Namen immer ein Underscore, so dass man eigentlich nach "AA_" suchen könnte?

Ein Underscore folgt immer, allerdings sind die Kürzel danach nicht einheitlich. Das sind Kürzel mit 4 Großbuchstaben.
Das davor ist ein Zeitstempel, leider nicht nur mit Datum, sondern auch mit Stunden und Minuten, weshalb alles vor dem Kürzel auch unterschiedlich ist.

Zitat:

Code:

dataset_names = {'2012_06_01_AA'; ...
                            '2012_06_01_AB'; ...
                            '2012_06_01_AAB'; ...
                            '2012_06_01_ABA'; ...
                            '2012_06_01_DDB'};

dir_names = {'2012_06_01_AA_dumb.mat'; ...
                     '2012_06_01_AB_dumb.mat'; ...
                     '2012_06_01_AAB_dumb.mat'; ...
                     '2012_06_01_ABA_dumb.mat'; ...
                     '2012_06_01_DDB_dumb.mat'};
 


dir_names ist die größere Menge, dataset_names ist eine Schnittmenge von dir_names, alle "Namen" die in dataset_names stehen, sind auch in dir_names ...allerdings eben mit einem "Anhängsel" wie zB. "_dumb.mat".

Zitat:

Code:

% Lösung 1:
Cut1 = strrep(dir_names, '_dumb.mat', '');
index = intersect(dataset_names, Cut1);
 


funktiniert leider nicht, sorry da hab ich mich wieder blöd ausgedrückt.
"dumb" ist nicht immer "dumb", korrekt wäre '_*.mat'.

Zitat:

Code:

% Lösung 2:
App1 = strcat(dataset_names, '_');
match = false(size(dataset_names));
for i = 1:numel(match)
  aName = dataset_names{i};
  match(i) = any(strncmp(dir_names, aName, length(aName)));
end


die hab ich leider noch nicht verstanden, aber sie macht jeden falls nicht das was ich gerne hätte Sad


Was ist am Ende haben will, ist ein Cell mit Strings in dem die Schnittmenge der beiden ist.
Es sollen also in "dataset_names" nur noch die Strings stehen bleiben die auch in "dir_names" sind.
Private Nachricht senden Benutzer-Profile anzeigen
 
geieraffe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2012, 09:40     Titel:
  Antworten mit Zitat      
_Peter hat Folgendes geschrieben:

Dann müsstest du mal zeigen, wie du das gemacht hast.


Vielen Dank Peter,
Ich hab deine Lösung auch versucht, allerdings sind meine beiden Cells nicht gleich lang (war im Beispiel von mir schlecht angegeben, sorry).
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.06.2012, 09:51     Titel:
  Antworten mit Zitat      
Hallo geieraffe,
[uqote]Es sollen also in "dataset_names" nur noch die Strings stehen bleiben die auch in "dir_names" sind.[/quote]
Die 2. Lösung hat nicht die Strings, sondern nur die entsprechenen Indices erstellt. Die Strings lassen sich aber leicht daraus erhalten:
Code:
% Lösung 2:
...
cleaned_dataset_names = dataset_names(match);

Hilft dies nun?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
geieraffe
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 97
Anmeldedatum: 19.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.06.2012, 10:14     Titel:
  Antworten mit Zitat      
Besten Dank!
Das mit den Indices hatte ich verstanden, aber ich hatte einen Fehler meinerseits übersehen, warum ich in match trotzdem nur false-Einträge hatte.
Funktioniert jetzt aber wunderbar.
Zwar mit Schleife, aber weit weniger aufwändig und sicherer als meine bisherige Lösung!
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.