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

 

Mensch61
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 13.11.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2014, 20:07     Titel: Spalten addieren von verschachtelten Cell-Array
  Antworten mit Zitat      
Hallo,
ich hab im schon etwas im Forum umgeschaut aber nichts passendes gefunden.Ich hab ein 1x1 cell array mit 1x19 cell array inhalt.Die Spalten von dem 1x19 cell array sind jeweils 2688x1 groß.
Mein Probelm: Wie addiere zb die 3,7,11 und 15 Spalte von diesem 1x19 cell array.Irgend jemand eine Idee? Würde mich sehr freuen

Vielen Dank im Voraus
Gruß
Private Nachricht senden Benutzer-Profile anzeigen


Yvonne
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.07.14
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 14.11.2014, 00:54     Titel:
  Antworten mit Zitat      
Hi,

ich bin mir nicht sicher, ob ich das eigentliche Problem verstehe.
Die Syntax um z.b. die erste und zwete Spalte zu addieren lautet
Code:

C{1}{1}+C{1}{2}
 

vorausgesetzt die Inhalte des 19x1 Cell Arrays sind Vektoren (numerical).

Hilft Dir das weiter?

LG, Yvonne
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: 14.11.2014, 10:36     Titel:
  Antworten mit Zitat      
Ja es sind nur Zahlen die ich addieren will aber bei deinem Code zeigt er mir diesen Fehler an

Undefined function 'plus' for input arguments of type 'cell'.
Private Nachricht senden Benutzer-Profile anzeigen
 
Yvonne
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.07.14
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 14.11.2014, 10:48     Titel:
  Antworten mit Zitat      
Dann handelt es sich nicht um Zahlen sondern um Zellen (das sagt ja die Fehlermeldung).

Du müsstest gegebenenfalls einen Beispieldatensatz mitschicken, der Dein Problem verdeutlicht.

z.B.
Code:

% Create some mock-up data
C = cell(1,5);
C{1} = rand(10,1);
C{2} = rand(10,1);
C{3} = rand(10,1);
C{4} = rand(10,1);
C{5} = rand(10,1);

C = {C}

% Add two columns
C{1}{1} + C{1}{2}
 


LG, Yvonne
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: 14.11.2014, 14:15     Titel:
  Antworten mit Zitat      
Also so sieht meine Datei also das im Workspace gespeicherte Cell array

Neuer Ordner.rar
 Beschreibung:

Download
 Dateiname:  Neuer Ordner.rar
 Dateigröße:  50.84 KB
 Heruntergeladen:  388 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 14.11.2014, 14:56     Titel:
  Antworten mit Zitat      
Hallo

Hast du aus Excel-Datei oder Text-Datei diese RAW-Daten eingelesen?

Jedenfalls deine Kommazahlen müssen erstmals von String zu Doubles konvertiert werden. Dazu muss das Komma durch den Punkt ersetzt werden.

Code:

% ertsmal die Daten extrahieren
rawdata = rawdata{1};
rawdata = cat(2, rawdata{:});
% Komma durch Punkt ersetzen
rawdata = regexprep(rawdata, ',', '.')

% jetzt die Spalten konvertieren:
M = str2double(rawdata(:, [3,7,11,15]));

% jetzt kannst du diese Spalten beliebig addieren
sum(M, 2)

% oder

M(:, 1) + M(:,2) + M(:, 3) + M( :, 4)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Yvonne
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.07.14
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 14.11.2014, 14:58     Titel:
  Antworten mit Zitat      
Hi,

wie vermutet befinden sich in Deinem 1x19 Cell Array keine Vektoren, sondern weitere Zellen.
In diesen Cell-Arrays, sind wiederum ebenfalls keine Zahlen, sondern Strings.
Die Strings stellen zwar Zahlen dar, haben aber als Dezimaltrennzeichen ein Komma.

Was Du also tun musst ist:
1. Kommas durch Punkte ersetzen
2. Strings in Zahlen umwandeln
3. Cell-Array in einen Vektor umwandeln

Code:

% Extract 3rd and 7th cell array
a3 = rawdata{1}{3};
a7 = rawdata{1}{7};

% Replace commas by dots
b3 = strrep(a3, ',', '.');
b7 = strrep(a7, ',', '.');

% Convert strings to doubles
c3 = cellfun(@str2double, b3, 'UniformOutput', false);
c7 = cellfun(@str2double, b7, 'UniformOutput', false);

% Convert cell array to matrix (vector)
d3 = cell2mat(c3);
d7 = cell2mat(c7);

% Do whatever calculation you want to perform
result = d3+d7;
 


Ps.: Du solltest jedoch in Erwägung ziehen, Deine Daten von vorn herein effizienter anzuordnen. Schau Dir in dem Beispiel einfach mal den Speicherbedarf von c3 und d3 an ...

LG, Yvonne
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: 15.11.2014, 14:37     Titel:
  Antworten mit Zitat      
Vielen Dank für die beiden Antworten hat mich sehr gefreut und beides funktioniert einwandfrei Smile Die eingelesene Datei ist eine csv-Datei.

Ich hätte aber noch eine zweite Frage und zwar wenn jetzt mein cell array größer ist d.h nicht mehr 1x1 sondern 1x35 und die Spalten dann jeweils unterschiedlich also 1x19 1x15 1x11.
Ich möchte jeweils immer für eine Spalte also für ein 1x19 oder 1x15 jeweils bei der 3 anfangen und in dreier Schritten addiereren und bei der 5 anfangen und auch in dreier Schritten addieren und das jeweils für das ganze cell array.Vielleicht wirds an meinem Code verständlich was ich vorhab.Bloß bei den Spalten konvertieren weis ich nicht wie ich des umsetzen soll.

Code:
for i=1:size(rawdata,2)
    for n=3:3:size(rawdata{i},2)
        for m=5:3:size(rawdata{i},2)

% ertsmal die Daten extrahieren
rawdata = rawdata{i};
rawdata = cat(2, rawdata{:});
% Komma durch Punkt ersetzen
rawdata = regexprep(rawdata, ',', '.') ;

% jetzt die Spalten konvertieren:
M = str2double(rawdata(:, [3,7,11,15]));
N = str2double(rawdata(:, [5,9,13,17]));

% jetzt kannst du diese Spalten beliebig addieren
F=sum(M, 2) ;
G=sum(N,2);
H=[F,G];

        end
    end
end

 



Ich häng am besten wieder meine Datei an dann wirds vielleicht verständlicher.

Neuer Ordner.rar
 Beschreibung:

Download
 Dateiname:  Neuer Ordner.rar
 Dateigröße:  818.88 KB
 Heruntergeladen:  408 mal
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: 15.11.2014, 15:06     Titel:
  Antworten mit Zitat      
srry ich meinte in vierer Schritten zb 3,7,11 und gleichzeitig auch5,9 und 13.Also hier mal mein Code

Code:
for i=1:size(rawdata,2)
    for n=3:4:size(rawdata{i},2)
        for m=5:4:size(rawdata{i},2)

% ertsmal die Daten extrahieren
rawdata = rawdata{i};
[rawdata,~] = cat(2, rawdata{:});
% Komma durch Punkt ersetzen
rawdata = regexprep(rawdata, ',', '.') ;

% jetzt die Spalten konvertieren:
M = str2double(rawdata(:, n));
N = str2double(rawdata(:, m));
% jetzt kannst du diese Spalten beliebig addieren
F=sum(M, 2) ;
G=sum(N,2);
H=[F,G];

        end
    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: 16.11.2014, 14:34     Titel:
  Antworten mit Zitat      
Hat keiner eine Idee Sad ?
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: 16.11.2014, 19:25     Titel:
  Antworten mit Zitat      
Hallo Mensch61,

Ich habe keine Idee, weil ich nicht erkenne, was nun genau die Frage ist.

Gruß, Jan
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: 16.11.2014, 23:38     Titel:
  Antworten mit Zitat      
Hallo Jan S,

also wie oben schon steht hab ich zuerst versucht für ein 1x1 cell array mit 1x19 Spalteninhalt jeweils die 3,7,11 zu addieren.Dabei haben mir denny und yvonne mit ihren codes geholfen und es hat auch super geklappt.

Jetzt hab ich ein 1x35 cell array mit mehren Spalten zb 1x19,1x15 oder 1x11.
Mein Problem:Ich will jetzt immer von der 3 Spalte aus anfangen mit 4 Schritten und dann diese addieren also zb Spalte 3,7,11 addieren und gleichzeitig von der 4 Spalte anfangen mit vierer Schritten addieren also zb 5,9,13.Beide Ergebnisse müssen dann seperat vorliegen.
Das muss ich jetzt für jedes cell array machen also für 1x19,1x15 un 1x11 usw.

Ich hoffe ich habs einigermaßen verständlich ausgedrückt.Wäre echt super wenn mir jemand weiterhelfen könnte Smile Mein Code(erweiterter) sieht so aus

Code:
for i=1:size(rawdata,2)
   

% ertsmal die Daten extrahieren
rawdata = rawdata{i};
rawdata = {cat(2, rawdata{:})};
% Komma durch Punkt ersetzen
rawdata = regexprep(rawdata, ',', '.') ;
[B,K]=size(rawdata{i});

   
           
% jetzt die Spalten konvertieren:
M = str2double(rawdata(:, [3:4:end]));
N = str2double(rawdata(:, [5:4:end]));
% jetzt kannst du diese Spalten beliebig addieren
F=sum(M,2) ;
G=sum(N,2);
H=[F,G];

end
 


Neuer Ordner.rar
 Beschreibung:

Download
 Dateiname:  Neuer Ordner.rar
 Dateigröße:  818.88 KB
 Heruntergeladen:  422 mal
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: 17.11.2014, 18:14     Titel:
  Antworten mit Zitat      
Hallo
Ich bekomm ganze Zeit den Fehler bei diesem Code:

Error using regexprep
All cells must be strings.

Error in mehrereDaten
rawdata = regexprep(rawdata, ',', '.') ;


Hat jemand vielleicht eine Idee wie ich das beheben kann. Wink

Danke im Voraus
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.11.2014, 19:51     Titel:
  Antworten mit Zitat      
Hallo
Zitat:
Ich bekomm ganze Zeit den Fehler bei diesem Code:

Error using regexprep
All cells must be strings.

Weil du diese Zeile verändert hast:

Code:


rawdata = {cat(2, rawdata{:})};
 

richtig wäre:
du hast in Zelle 5, nicht CSV eingelesen sondern M-File, deswegen habe ich noch zusätzlich eine Überprüfungsroutine dazwischen geschaltet.
Wo ich prüfe, ob die Anzahl der spalten überall gleich ist.
Code:

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));
      N = str2double(rawdatatmp(:, 5:4:end));
      % 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
   
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, 00:22     Titel:
  Antworten mit Zitat      
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? 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?

Vielen Dank im Voraus

Gruß Mensch61
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.