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

ausgewählte *.mat Datei auf Format des Inhalts überprüfen

 

DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.11.2015, 16:21     Titel: ausgewählte *.mat Datei auf Format des Inhalts überprüfen
  Antworten mit Zitat      
Hallo goMatlab Forum,

ich sitze nun schon seit einiger Zeit an meiner GUI Signalviewer zur Darstellung von Signalen im Zeit- und Frequenzbereich. Aktuell beschäftige ich mit der Untergui zur Auswahl der *.mat Files und deren Inhalt. Die Auswahl ist auch bereits realisiert aber ich hänge nun an der Überprüfung der Daten. Der im linken Fenster ausgewählte mat-file wird zunächst per load geöffnet und die Feldnamen des Structs ermittelt. Nun muss jedes Feld des Structs überprüft werden.

Zulässig sind nur Arrays mit der Dimension [1xN] oder [Nx1]. Weitere Verschachtelung wie structs, cells etc innerhalb eines Feldes nicht zulässig. Ich habe nur keine Ahung wie ich das sinnvoll, d.h. ohne großen Programmieraufwand testen kann.

Evtl. hilft mein bisheriger Code zum Verständnis:

Code:

function add(varargin)
      values = get(navlist,'Value');      
        dir_pick = fdir(values(1));            
        pick = dir_pick.name;  
        pick_full = fullfile(current_dir,pick);                              
        % open *.mat file
        pick = load(pick_full);
        if ~isempty(pick)
            if isstruct(pick)
                % get struct fieldnames
                fields = fieldnames(pick);
                               
                fs = [fs; ones(size(fields,1),1)];
                for i = 1:size(fields,1)
                    if size(getfield(pick,fields{i,1}),1) > 1 && size(getfield(pick,fields{i,1}),2) > 1
                        % is field an array?
                        warndlg(['Unzulässiges Datenformat in ' fields{i,1}])
                    else
                        pick_full = fullfile(current_dir,dir_pick.name);
                        %dir_pick.name = pick_full;

                        if ~nodupes || ~any(strcmp(full_file_picks,pick_full))
                            file_picks{end + 1} = ['(' dir_pick.name ') ' fields{i,1}]; %#ok<AGROW>
                            full_file_picks{end + 1} = [pick_full ' (' fields{i,1} ')']; %#ok<AGROW>
                            dir_picks(end + 1) = dir_pick; %#ok<AGROW>
                            names{end + 1,1} = fields{i,1}; %#ok<AGROW>
                        end
                    end
                end            
            end
        else
            warndlg([dir_pick.name ' konnte nicht geladen werden'])            
        end
      if show_full_path
         set(pickslist,'String',full_file_picks,'Value',[]);            
      else
         set(pickslist,'String',file_picks,'Value',[]);
      end
      set([removebut,moveupbut,movedownbut],'Enable','off');
        set(Fs_file,'Enable','on','String','1')
        set(NumVal_file,'String',length(getfield(pick,names{1,1}))) %#ok<*GFLD>
   end
 



Das Problem in der Funktion ist nun in der Abfrage

Code:
if size(getfield(pick,fields{i,1}),1) > 1 && size(getfield(pick,fields{i,1}),2) > 1


welche so ja nicht wirklich funktioniert. Hat das Feld z.B. [1x11 cell], wobei sich in jeder Zelle ein Array/Matrix befindet, müsste man ja auch wieder alle Zellen überprüfen. Denn an sich ist das Format [1x11 cell] ja zulässig, so fern sich in jeder Zelle nur ein Zahlenwert befindet.

Vielen Dank schon mal für eure Vorschläge!

Gruß Sebastian

uipickfiles.gif
 Beschreibung:

Download
 Dateiname:  uipickfiles.gif
 Dateigröße:  96.51 KB
 Heruntergeladen:  236 mal
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: 22.11.2015, 17:52     Titel: Re: ausgewählte *.mat Datei auf Format des Inhalts überpr
  Antworten mit Zitat      
Hallo DSP,

Zitat:
Zulässig sind nur Arrays mit der Dimension [1xN] oder [Nx1]. Weitere Verschachtelung wie structs, cells etc innerhalb eines Feldes nicht zulässig.
[...]
Denn an sich ist das Format [1x11 cell] ja zulässig, so fern sich in jeder Zelle nur ein Zahlenwert befindet.

Sind Cells nun erlaubt oder nicht?

Den Code zum Überprüpfen des Inhalts kannst Du in eine Unterfunktion schreiben, die sich bei Bedarf (wenn also Cells erluabt wären) rekrusiv aufruft. Dann könnte dies helfen:
Code:
FileData = load(pick_full);
C = struct2cell(FileData);
C_isVector = (cellfun('prodofsize', C) == cellfun('length', C)) & ...  % [edited, && -> &]
                      cellfun('ndims', C) == 2;
C_isNumeric = cellfun(@isnumeric, C, 'UniformOutput');
C_isCell = cellfun('isa', C, 'cell');
 

Gruß, Jan

Zuletzt bearbeitet von Jan S am 22.11.2015, 22:28, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.11.2015, 18:14     Titel:
  Antworten mit Zitat      
Hallo Jan,

Danke für deine schnelle Antwort. Das zulässig von [1x11 cell] bezog sich lediglich auf size, welche ja per eigener Definition/Bedingung der if Anweisung richtig wäre. Aber ich halte mich mal an das sptool, wo lediglich 2D arrays vom Typ double erlaubt sind.

Daher nützt mir dein Vorschlag auch leider nichts, wobei ich beim Ausführen auch folgende Fehlermeldung erhalte.

Code:
Operands to the || and && operators must be convertible to logical scalar values.

Error in uipickfiles/add (line 677)
        C_isVector = (cellfun('prodofsize', C) == cellfun('length', C)) && ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.11.2015, 18:44     Titel:
  Antworten mit Zitat      
Hallo,

für kompakte Argumentüberprüfungen ist oft validateattributes sehr hilfreich, z.B.
Code:
validateattributes(a, {'double'}, {'vector'})


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Themenstarter

Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 22.11.2015, 22:04     Titel:
  Antworten mit Zitat      
Super...Vielen Dank Harald! Das war genau was ich gesucht habe. Ich bin überrascht, dass es am Ende durch nur einen Befehl gelöst werden kann.
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: 22.11.2015, 22:32     Titel:
  Antworten mit Zitat      
Hallo DSP,

Ja, das war einen Tipp-Fehler: Für Vektoren muss es & statt && heißen:
Code:
C_isVector = (cellfun('prodofsize', C) == cellfun('length', C)) & ...
                      cellfun('ndims', C) == 2;
C_isDouble = cellfun('isclass', C, 'double');

Oder:
Code:
C_isVector = cellfun(@isvector, C, 'UniformOutput', true);

Gruß, Jan
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.