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

GUI_Mat_Files_Nach_Bestimmten_Namen_Inhalt_Suchen

 

Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.09.2012, 11:50     Titel:
  Antworten mit Zitat      
Hallo JaSoIstEs,

Zitat:
Code:
list = dir(fullfile(FilePath,['*',key,'*','*',key1,'*','*.*']))

Die doppelten Sternchen sind überflüssig. Besser:
Code:
list = dir(fullfile(FilePath,['*', key, '*', key1, '*.*']))


Ich habe den Eindruck, Dir ist das Verhalten des Sterns noch nicht ganz klar. Er bedeutet, dass stattdessen irgendein String eingefügt sein darf. Mit "[key1, '*', key2]" bekommst Du alle Filenamen, die mit key1 beginnen. Wenn vor key1 etwas stehen darf, brauchst Du: "['*', key1, '*', key2, '*.*']".

Wenn direkt nach key2 die File-Extension kommen soll: "['*', key1, '*', key2, '.*']".

Doppelte Sternchen bedeuten dagegen, dass zwei mal irgendetwas kommen darf, was aber natürlich das gleiche ist wie einmal.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen


JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 13:11     Titel:
  Antworten mit Zitat      
danke euch beiden habt mir sehr geholfen.
das mit dem suchen funktioniert jetzt auch sehr gut.

nur hab ich jetzt das Problem das ich die in der (GUI) checkbox generierten "key´s" nicht zur mfile kriege (glaube ich zumindest)

Hier in der Gui einmal die checkbox mit dem "key1":
Code:

function PGN_Callback(hObject, eventdata, handles)
% hObject    handle to PGN (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

if (get(hObject,'Value') == get(hObject,'Max'))
key1 = 'PGN';
assignin('base','key1',key1);
else
   evalin('base','clear key1');
end
 

das funktioniert auch wie es soll.

dann rufe ich in der GUI die m-file auf mit der ich dann die keys benutze:
Code:

function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
NominalMomentGleichNull;
assignin('base','PGN_SKF',PGN_SKF);
 

1. auf die checkbox klicken: jetzt wird die variable key1 mit dem inhalt PGN erzeugt
2. ich starte die m-file über GUI dort wird aber nichts erkannt.
ich habe in der m-file eine statusabfrage
Code:
Status1=exist('key1')

damit ich sehe ob es gesetzt ist. Wie gesagt wenn ich die mfile über die gui starte passiert nichts bzw. ich kriege den status 0 für key1.

starte ich die m-file direkt über matlab zeigt die statusabfrage mir eine 1 zurück und es funktioniert alles prima.

also wo ist das Problem bei der GUI ?


Probiert habe ich schon:

Code:

function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

evalin('base','key1');
NominalMomentGleichNull;
assignin('base','PGN_SKF',PGN_SKF);


oder

Code:

function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

 if exist('key1')
    evalin('base','key1');
 end
NominalMomentGleichNull;
assignin('base','PGN_SKF',PGN_SKF);


aber leider klappts nicht. oder ich überseh etwas oder hab was vergessen.

Danke im Voraus.
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 13:25     Titel:
  Antworten mit Zitat      
muss natürlich so geschrieben werden

Code:

key1 =evalin('base','key1');
 


klappt trotzdem nicht.
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 13:35     Titel:
  Antworten mit Zitat      
habs hinbekommen Very Happy
wieso kriegt man die sachen erst hin wenn man es gepostet hat Embarassed .

Code:

function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

Status1=evalin('base','exist(''key1'')');
Status2=evalin('base','exist(''key2'')');
Status3=evalin('base','exist(''key3'')');
Status4=evalin('base','exist(''key4'')');

if Status1==1
    key1 =evalin('base','key1');
elseif Status2==1
    key2 =evalin('base','key2');
elseif Status3==1
    key3 =evalin('base','key3');
elseif Status4==1
    key4 =evalin('base','key4');
end

NominalMomentGleichNull;
assignin('base','PGN_SKF',PGN_SKF);
 
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 15:09     Titel:
  Antworten mit Zitat      
da stimmt doch was nicht.... Mad

wenn ich z.B. 2 keys auswähle kommt im GUI bis hier hin auch alle 2 Werte an.

Code:

function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

Status1=evalin('base','exist(''key1'')')
Status2=evalin('base','exist(''key2'')')
Status3=evalin('base','exist(''key3'')')
Status4=evalin('base','exist(''key4'')')


aber anscheinend mach ich glaube ich hier was falsch

Code:
if Status1==1
    key1 =evalin('base','key1');
elseif Status2==1
    key2 =evalin('base','key2');
elseif Status3==1
    key3 =evalin('base','key3');
elseif Status4==1
    key4 =evalin('base','key4');
end

NominalMomentGleichNull;
assignin('base','PGN_SKF',PGN_SKF);
 


weil in der m-file wo die keys dann verwendet werden kommt immer nur 1 signal an. Surprised Crying or Very sad
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2012, 15:48     Titel:
  Antworten mit Zitat      
Hat sich auch erledigt.

Danke schön.

Das Problem war das ich if/elseif usw. geschrieben habe.

Ich ich hab es dann in einzelne If/end geschrieben und jetzt klappt es.

Danke trotzdem für alles.
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.09.2012, 21:33     Titel:
  Antworten mit Zitat      
Hallo JaSoIstEs,

Die doppelten Sterne sind überflüssig:
Code:
list = dir(fullfile(FilePath,['*',key,'*','*',key1,'*','*.*']))
% Besser:
list = dir(fullfile(FilePath,['*',key,'*',key1,'*.*']))

Ein Stern bedeutet ja, dass statt dessen irgendein string stehen kann. Zwei Sterne wären dann zwei beliebige Strings, die man aber natürlich auch zu einem zusammenfassen kann.
Wenn der Such-String nicht mit einem Stern beginnt, muss der "key" auch ganz am Anfang erscheinen.
Das ist also ganz logisch aufgebaut.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2012, 12:39     Titel:
  Antworten mit Zitat      
Servus,

ich muss leider noch einmal stören.

mit dem was ich jetzt gemacht habe konnte ich ja bestimmte strings auswählen und matlab danach suchen lassen.
was er gesucht hat waren matfiles die ich dann später in eine Datenstruktur gepackt habe und damit weiter gearbeitet hab.

Das will ich auch weiterhin machen aber nicht nur mit mehr "spielraum".

beispiel filenamen: (1)a_b_c_d und (2)a1_b1_c1_d1 (3)a2_b2_c2_d2

wenn ich jetzt wie gehabt nach bc suche kriege ich file (1).

aber ich will matlab über die checkboxen sagen suche files mit 'b' 'c' 'a1' und 'd2'. dann sollten alle 3 files erkannt werden die ich dann weiter verarbeiten kann.

habe überlegt das dann mit list list1 list2 zu machen und sie dann mit cat zu 'verbinden'

wäre das zu kompliziert ? wenn ja was wäre einfacher ? oder wie würdet ihr das realisieren ?
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2012, 12:49     Titel:
  Antworten mit Zitat      
vergessen zu sagen...

bei mir sind es 4 verschiedene Stichwort-Gruppen.

Gruppe1 = 2 Möglichkeiten(a1,a1)
Gruppe2 = 2 Möglichkeiten(b2,b2)
Gruppe3 = 6 Möglichkeiten(c1,c2,c3,c4,c5,c6)
Gruppe4 = 3 Möglichkeiten(d1,d2,d3)

jetzt kann ich aus jeder gruppe 1 auswählen und er sucht nach den namen wie oben beschrieben möchte ich dann z.B. aus Gruppe1 1 Möglichkeit auswählen aus Gruppe2 1 auswählen aber aus Gruppe3 2 auswählen.

dann soll mir matlab files finden die folgende namensverbindung hat raussuchen :

- a1_b1_c1
- a1_b1_c2

ich hoffe das war verständlicher als oben.


DANKE IM VORAUS.
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2012, 15:37     Titel:
  Antworten mit Zitat      
Hallo denny

kann man das intersect auch für eine n-anzahl an cell´s
benutzen weil das würde mich auch schon sehr weiter helfen.
wenn nicht gibt es da eine andere möglichkeit.
bei mir isnd das 13 cell´s.

Danke im Voraus
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 19.09.2012, 17:22     Titel:
  Antworten mit Zitat      
JaSoIstEs hat Folgendes geschrieben:
Hallo denny

kann man das intersect auch für eine n-anzahl an cell´s
benutzen weil das würde mich auch schon sehr weiter helfen.
wenn nicht gibt es da eine andere möglichkeit.
bei mir isnd das 13 cell´s.

Danke im Voraus

Du meinst du hast gleichzeitig 13 Cells ?
Mit INTERSECT kann man nur aus 2 Mengen Schnitt bilden, also musste du für deine 13 Cells den Befehl sequenziell aufrufen.
Ich würde an dieser Stelle REGEXP verwenden, dazu ist das besser wenn du dir Schlüsselwörter in Cell ablegst:
Code:

key   ={'Michael','1800'}
list    = dir(fullfile(FilePath,['*.*']));
list    = {list(~[list.isdir]).name};

pos  = false(length(key),length(list))
for k=1:length(key)
  tmppos = regexp(list,key{k})
  pos(k,:) = ~cellfun('isempty',tmppos )
end


list(all(pos,1))
 
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2012, 08:00     Titel:
  Antworten mit Zitat      
Hallo denny danke erst mal für deine antwort.
momentan sind es noch 13 cells später werden es an die 50-60.
Die cells sind einfach stichwörter mit dem ich files suche und filtern will.

die 13 cells (suchwörter) sindn icht immer gleichzeitig "an" sondern man soll später zwischen 0-13 (oder später 50-60) checkboxes haben mit dem man bestimmte files dann aussuchen kann.

es gibt ja das intersect was leider nur für 2 cells benutzt werden kann hab im internet eine funktion die von jemanden geschrieben worden ist gefunden und nennt sie mintersect (multiple.....)

kannst mal schauen ob die was taugt ?

Code:

function runIntersect = mintersect(varargin)
%MINTERSECT Multiple set intersection.
%   MINTERSECT(A,B,C,...) when A,B,C... are vectors returns the values
%   common to all A,B,C... The result will be sorted.  A,B,C... can be cell
%   arrays of strings.  
%
%   MINTERSECT repeatedly evaluates INTERSECT on successive pairs of sets,
%   which may not be very efficient.  For a large number of sets, this should
%   probably be reimplemented using some kind of tree algorithm.
%
%   MINTERSECT(A,B,'rows') when A,B,C... are matrices with the same
%   number of columns returns the rows common to all A,B,C...
%
%   See also INTERSECT

flag = 0;
if isempty(varargin),
    error('No inputs specified.')
else
    if isequal(varargin{end},'rows'),
        flag = 'rows';
        setArray = varargin(1:end-1);
    else
        setArray = varargin;
    end
end

runIntersect = setArray{1};
for i = 2:length(setArray),
   
    if isequal(flag,'rows'),
        runIntersect = intersect(runIntersect,setArray{i},'rows');
    elseif flag == 0,
        runIntersect = intersect(runIntersect,setArray{i});
    else
        error('Flag not set.')
    end
   
    if isempty(runIntersect),
        return
    end
   
end
 


Danke.
 
JaSoIstEs

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2012, 09:02     Titel:
  Antworten mit Zitat      
Hey denny habe deinen code ausprobiert
kriege leider einen fehler.
Code:

key   ={'PGN','Ibrahim','Michael','1400',}
list    = dir(fullfile(FilePath,['*.*']));
list    = {list(~[list.isdir]).name};

pos  = false(length(key),length(list))
for k=1:length(key)
  tmppos = regexp(list,key{k}) %HIER KRIEGE ICH DEN FEHLER.
  pos(k,:) = ~cellfun('isempty',tmppos ) ;
end
list(all(pos,1)) ;
 


Der Fehler:
Code:

??? Cell contents reference from a non-cell array
object.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 20.09.2012, 09:29     Titel:
  Antworten mit Zitat      
Hallo,

ich kann den Fehler nicht reproduzieren,
so wie es in deinen Beitrag jetzt steht -- funktioniert.
Also da kommt gleich die Frage auf, wo liegt der Unterschied zw. dem Code dass du gepostet hast und was du ausprobiert hast?

PS: ja die Funktion das du in FEX gefunden hast sieht vernünftig aus, so hätte ich das auch gelöst wenn ich INTERSECT mehrmals verwenden müsste
Private Nachricht senden Benutzer-Profile anzeigen
 
JaSoIstES

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2012, 10:11     Titel:
  Antworten mit Zitat      
Ja sorry habs auch grad gemerkt habs im code gändert und dann gepostet bei mir stand es vorher so da
Code:

key   ={key1,key2,key3}


aber dürfte ja eigentlich auch kein Problem sein oder ?

wenn ich das so mache wie oben gepostet kriege ich an meinem code den fehler
Code:

key   ={'PGN','Ibrahim','1400'}
list    = dir(fullfile(FilePath,['*.*']));
list    = {list(~[list.isdir]).name};

pos  = false(length(key),length(list)) ;
for k=1:length(key) ;
  tmppos = regexp(list,key{k}) ;
  pos(k,:) = ~cellfun('isempty',tmppos ) ;
end
list(all(pos,1)) ;

names = {list.name};%Nun ist hier der Fehler
Data = cell(1, numel(names));

    for i = 1:numel(names)
    Data{i} = load ('-mat', fullfile(FilePath, names{i}));  
    end


Fehler:
Code:
Attempt to reference field of non-structure array.


Um den code "mintersect" zu benutzen habe ich mir gedacht das ich immer eine neue "list" erstelle bei den vorhandenen "schlüßelwörter"
und dann da durchlaufen lasse und er "sortiert" mir das dann aus.

wie sollte ich das dann da schreiben bzw. wie den funktions aufruf machen ?

ich weiß ich frag so viel aber das sind alles neue sachen für mich Embarassed

Gruß und Danke
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2, 3, 4, 5, 6  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.