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

Spalten addieren von verschachtelten Cell-Array

 

denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 18.11.2014, 12:52     Titel:
  Antworten mit Zitat      
Mensch61 hat Folgendes geschrieben:
Hallo denny,
erstmal vielen Dank für deine Antwort klappt super. Smile

Aber noch eine Frage.
Kann es sein das bei deinem Code nur die Spalten von dem letzten Cell-Array 1x11 addiert werden?

Hallo ich habe nur den Fehler korrigiert, das heißt nicht das ist die Logik deines Programms verändert habe.

Zitat:
Ich hatte eigentlich vor von jedem cell array nach dem Schema also von der dritten Spalte aus in vierer Schritten und von der fünften Spalte aus mit vierer Schritten die Spalten zu addieren.Wäre echt super wenn ich des auch noch irgendwie machen kann.Wie könnte ich des realisieren?
Gruß Mensch61

Wenn du alle Ergebnisse haben möchtest, dann muss die Ergebnisse ja irgendwie zwischen speichern, also z.B die Variable H als Cell vorinitialisieren und dann abspeichern.
Summieren der angesprochen Spalten tust du ja bereits, du musst nur aufpassen bei der letzten Spalte die ist nämlich leer, was bei Konvertierung zu Double NaNs erzeugt.


Code:
H = cell(1, size(rawdata,2));
for i = 1:size(rawdata,2)
   
   
   % ertsmal die Daten extrahieren
   rawdatatmp = rawdata{i};
   equal_size = unique(cellfun(@length, rawdatatmp));
   if length(equal_size)== 1
      rawdatatmp = cat(2, rawdatatmp{:});
      % Komma durch Punkt ersetzen
      rawdatatmp = regexprep(rawdatatmp, ',', '.') ;
      %    [B, K]=size(rawdatatmp{i});
     
     
     
      % jetzt die Spalten konvertieren:
      M = str2double(rawdatatmp(:, 3:4:end-1));
      N = str2double(rawdatatmp(:, 5:4:end-1));
      % jetzt kannst du diese Spalten beliebig addieren
      F = sum(M,2) ;
      G = sum(N,2);
      H{i} = [F,G];
   else
      fprintf('in cell %d: Anzahl der Spalten ist nicht konsistent', i);
   end
   
end
Private Nachricht senden Benutzer-Profile anzeigen


Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2014, 13:19     Titel:
  Antworten mit Zitat      
Hallo,
ja habs jetzt auch so verändert das er mir die Ergebnisse in einem cell speichert.Es funktioniert super.Vielen Dank für deine Hilfe Smile

Gruß Mensch61
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2014, 21:06     Titel:
  Antworten mit Zitat      
Hallo,
ich hätt noch ein kleines Problem was ich überhaupt nicht in Griff kriege.Meine Datei sieht jetzt bischen anders aus d.h in ihr fehlen jetzt einige Spalten.Ich bekomm jetzt immer den Fehler beheben konnt ich ihn bis jetzt aber nicht.Vielleicht kann mir dabei jemand helfen ihn zu beheben.Vielen Dank im Voraus.

Error using cellfun
Input #2 expected to be a cell array, was double instead.

Error in mehrereDaten (line 82)
equal_size = unique(cellfun(@length, rawdatatmp));

Ordner.rar
 Beschreibung:

Download
 Dateiname:  Ordner.rar
 Dateigröße:  186.25 KB
 Heruntergeladen:  319 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 18.11.2014, 21:29     Titel:
  Antworten mit Zitat      
Die Fehlermeldung ist doch eindeutig. Input 2 = rawdatatmp ist kein cell typ, was aber für cellfun Bedingung ist.

Du kannst mal folgendes versuchen, da du hier den Wert von cell entnimmst

Code:

% ertsmal die Daten extrahieren
   rawdatatmp = rawdata{i};
% ändern in
rawdatatmp = rawdata(i); % Ergebnis ist wieder cell

% oder mit
mat2cell()
% arbeiten
 


Ich empfehle dir sich mal genauer mit dem Datentyp cell und dessen Umwandlung in der Doku zu befassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2014, 21:52     Titel:
  Antworten mit Zitat      
Wenn ichs aber wieder in ein cell umwandele kommt dieser Fehler.


Error using regexprep

All cells must be strings.

Error in mehrereDaten (line 87)
rawdatatmp = regexprep(rawdatatmp, ',', '.') ;
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2014, 15:24     Titel:
  Antworten mit Zitat      
Hat keiner ein Vorschlag wie der Fehler oben weg geht?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.11.2014, 15:39     Titel:
  Antworten mit Zitat      
Gib doch mal bitte ein Bsp. for rawdata vor, dass den Fehler verursacht.

Es ist oft schwer zu erahnen, welche Dimensionen Daten des Fragestellers haben. So auch hier...

Außerdem empfehle ich für die genaue Fehlererkennung mit dem Debugger zu arbeiten!
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2014, 16:40     Titel:
  Antworten mit Zitat      
Also mein Code/Datei/Fehlermeldung sieht folgendermaßen aus

Code:
UW_P_Q_Data=cell(i,1);

for i=1:size(rawdata,1)
   
   
   % ertsmal die Daten extrahieren
   rawdatatmp = rawdata{i};

   equal_size = unique(cellfun(@length, rawdatatmp));
   if length(equal_size)== 1
      rawdatatmp = cat(2, rawdatatmp{:});
      % Komma durch Punkt ersetzen
      rawdatatmp = regexprep(rawdatatmp, ',', '.') ;
     
     
     
     
      % jetzt die Spalten konvertieren:
      M = str2double(rawdatatmp(:, 3:4:end-1));
      N = str2double(rawdatatmp(:, 5:4:end-1));
      % jetzt kannst du diese Spalten beliebig addieren
      F = sum(M,2) ;
      G = sum(N,2);
      H = [-F,-G] ;
   else
      fprintf('in cell %d: Anzahl der Spalten ist nicht konsistent', i);
   end
   
   UW_P_Q_Data{i,1}=H;
   
end





Fehlermeldung:
Error using cellfun
Input #2 expected to be a cell array, was double instead.

Error in mehrereDatenCsv (line 79)
equal_size = unique(cellfun(@length, rawdatatmp));

Ordner (2).rar
 Beschreibung:

Download
 Dateiname:  Ordner (2).rar
 Dateigröße:  211.44 KB
 Heruntergeladen:  318 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 19.11.2014, 16:57     Titel:
  Antworten mit Zitat      
Nun, wenn rawdata = [] dann braucht es wohl auch keine Summe Wink

Code:

UW_P_Q_Data=cell(i,1);

for i=1:size(rawdata,1)    
    % ertsmal die Daten extrahieren
    rawdatatmp = rawdata{i};

    if isempty(rawdatatmp) % keine Daten
        UW_P_Q_Data{i,1}= NaN; % = 0 oder NaN ???
    else % Daten vorhanden, Summe berechnen

       equal_size = unique(cellfun(@length, rawdatatmp));
       if length(equal_size)== 1
          rawdatatmp = cat(2, rawdatatmp{:});
          % Komma durch Punkt ersetzen
          rawdatatmp = regexprep(rawdatatmp, ',', '.') ;
         
          % jetzt die Spalten konvertieren:
          M = str2double(rawdatatmp(:, 3:4:end-1));
          N = str2double(rawdatatmp(:, 5:4:end-1));
          % jetzt kannst du diese Spalten beliebig addieren
          F = sum(M,2) ;
          G = sum(N,2);
          H = [-F,-G] ;
       else
          fprintf('in cell %d: Anzahl der Spalten ist nicht konsistent', i);
       end

       UW_P_Q_Data{i,1}=H;
    end    
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.11.2014, 18:18     Titel:
  Antworten mit Zitat      
Genau das hat gefehlt danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2014, 17:58     Titel:
  Antworten mit Zitat      
Wenn ich die NaNs löschen will komme ich auf diese Fehlermeldun:

Matrix index is out of range for deletion.

Error in mehrereDatenXlsx (line 85)
UW_P_Q_Data(isnan(UW_P_Q_Data{i,1})) = [];


Mein Code sieht folgendermaßen aus:
Code:
for i=1:size(UW_P_Q_Data,1)
    if isnan(UW_P_Q_Data{i,1})
    UW_P_Q_Data(isnan(UW_P_Q_Data{i,1})) = [];
    end
end


Ich versteh leider nicht warum das nicht funktioniert.Irgend eine IDee vielleicht?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 20.11.2014, 18:15     Titel:
  Antworten mit Zitat      
Anstatt sie nachträglich zu löschen, warum setzt du nicht gleich hier ein leeres Feld?

Code:

...
 if isempty(rawdatatmp) % keine Daten
        UW_P_Q_Data{i,1}= []; % = 0 oder NaN ???
 else % Daten vorhanden, Summe berechnen
...
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2014, 18:19     Titel:
  Antworten mit Zitat      
Ja natürlich das ist auch ein Weg aber ich will das dem vollen cell array gleich das nächste volle cell array folgt und kein leeres Feld oder NaN
Private Nachricht senden Benutzer-Profile anzeigen
 
Mensch61
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.11.2014, 18:31     Titel:
  Antworten mit Zitat      
Habs raus mit dem wenn es leere Zellen gibt

Code:
ZelleClean = UW_P_Q_Data(~cellfun('isempty', UW_P_Q_Data'))
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 20.11.2014, 18:35     Titel:
  Antworten mit Zitat      
Probiers mal mit

Code:

% leere Felder löschen
UW_P_Q_Data = UW_P_Q_Data(~cellfun('isempty',UW_P_Q_Data);
 


Auch die Fehlermeldung ist eindeutig und auch logisch. Dein Index i läuft bis size(UW_P_Q_Data,1). Wenn du ein Element löschst, reduziert sich auch size(UW_P_Q_Data,1) und die Schleife will mit einem Index i auf eine Spalte zugreifen, die einfach nicht mehr da ist. Du müsstest hier entweder mit einer while Schleife arbeiten, oder aber einen anderen Index für den Zugriff auf

UW_P_Q_Data{...,1}

nutzen. Den for Schleifenzähler i kannst du nicht manipulieren. Es braucht daher einen separaten für den Zugriff.

Das ist aber mal wieder so ein Fehler, der wunderbar mit dem Debugger in einer schrittweisen Ausführen des Codes gefunden werden kann. Ich rate dir dringend den Umgang mit dem Debugger zu erlernen. Breakpoint vor die for Schleife setzten, dann mit F10 Schritt für Schritt weiter und entsprechend im Workspace nach den Variablen schauen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite Zurück  1, 2

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.