Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   
Bücher:

Studierende:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

grosse cell matrix zu double matrix entpacken

 

RatioTM
Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 27.01.2020, 23:21     Titel: grosse cell matrix zu double matrix entpacken
  Antworten mit Zitat      
Hallo,

ich habe eine sehr grosse cell Matrix (60x1 cell, wobei sich in dieser jeweils 1x111 cell matrizen befinden, in denen sich y x z double matrizen befinden mit der durchschnittlichen groesse ~2000x1). Ich moechte jetzt fuer alle 60 cell matrizen die 1x111 cell matrizen in einer double matrix zusammen fassen, wobei eine grosse y x 111 double matrix entstehen soll.

Ich habe dies mit cat versucht, jedoch gleingt mir auf diese Weise nur das entpacken der ersten cell matrix, wobei ich eine neue 1x6660 cell matrix erhalte, die das Ganze nur verkompliziert, da ich ja eine Zeitserie aufstellen moechte.
Ein weiterer Ansatz sieht wie folgt aus, wobei ich hier das Problem bekomme, dass die Groesse der Linken Matrix nicht mit der Groesse der Rechten Matrix im Verlauf der Schleife uebereinstimmt.
Code:
count=0;
for i=1:length(data)
    count=count+1;
a(i,:) = cat(2, data{i,1}{3:111});

end
 


Gibt es eine elegantere Loesung hierzu?

Vielen Dank fuer eure Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen


RatioTM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 28.01.2020, 11:27     Titel:
  Antworten mit Zitat      
okay, ich komme der Sache schon naeher. Ich entpacke die cell matrix jetzt wie folgt:

Code:
time=data{1,1}{1,1};
total= data{1,1}{1,2};
d= data{1,1}{1,3};
for i=1:size(data,1)
    time= [time;data{i,1}{1,1}];
    total= [total;data{i,1}{1,2}];
    d= [d; data{i,1}{1,3}];
end


Allerdings muesste ich das jetzt fuer 111 ariablen machen. Gehe ich wie folgt vor, funktioniert es nicht:

Code:
time=data{1,1}{1,1};
total= data{1,1}{1,2};
d= data{1,1}{1,3};
for i=1:size(data,1)
    time= [time;data{i,1}{1,1}];
    total= [total;data{i,1}{1,2}];
    d= [d; data{i,1}{1,3:111}];
end



selbiges gilt fuer einen weiteren Ansatz die Spalten per Schleife aufzufuellen:

Code:
for j=1:length(data)
for i=1:size(data{1,1},2)
dnlog= [d data{j,1}{1,i}];
end
end


Gibt es eine Idee, wie ich hier vorgehen koennte?

Beste Gruesse
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.958
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 28.01.2020, 12:29     Titel:
  Antworten mit Zitat      
Hallo,

ich habe Schwierigkeiten zu verstehen, was du erreichen willst. Ein konkretes Beispiel mit z.B. einem 3x1-Cell Array von 1x4-Cell Arrays mit 5x1-Vektoren könnte helfen.

Zitat:
in denen sich y x z double matrizen befinden mit der durchschnittlichen groesse ~2000x1

Sind die Vektoren innerhalb einer der 60x1-Zellen alle gleich lang? Dann hilft auf dieser Ebene cell2mat.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 28.01.2020, 14:20     Titel:
  Antworten mit Zitat      
Hallo,

ich habe das Problem in 3 Screenshots aufgezeigt (im Anhang):

Ich habe eine data matrix (60x1 cell matrix), die wiederum mit 1x111 cell matritzen gefuellt ist. In diesen befinden sich jeweils nx1 double matritzen von unterschiedlicher laenge, wobei sie alle nur eine Spalte haben. Ziel ist es, fuer alle 60 Spalten jeweils die darin enthaltenen Cell Matritzen in einer grossen double Matrix zusammenzufassen (wie eine Zeitserie). Das wuerde eine nx 111 Double Matrix ergeben am Ende.
Mit
Code:
time=data{1,1}{1,1};
totalions= data{1,1}{1,2};
dNlog= data{1,1}{1,3};
for i=1:size(data,1)
    time= [time;data{i,1}{1,1}];
    totalions= [totalions;data{i,1}{1,2}];
    dNlog= [dNlog; data{i,1}{1,3}];
end

bekomme ich das beispielhaft fuer die ersten 3 spalten der 1x111 cell matrix hin, jedoch muesste ich das auf diese Weise 111 mal wiederholen. Ich habe versucht, dies ueber oben gezeigte Beispielcodes zu loesen, was jedoch nicht funktioniert hat.

Beste Gruesse

data_cell_matrix3.png
 Beschreibung:

Download
 Dateiname:  data_cell_matrix3.png
 Dateigröße:  4.11 KB
 Heruntergeladen:  21 mal
data_cell_matrix2.png
 Beschreibung:

Download
 Dateiname:  data_cell_matrix2.png
 Dateigröße:  4.37 KB
 Heruntergeladen:  23 mal
data_cell_matrix.png
 Beschreibung:

Download
 Dateiname:  data_cell_matrix.png
 Dateigröße:  16.38 KB
 Heruntergeladen:  14 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.958
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 28.01.2020, 15:11     Titel:
  Antworten mit Zitat      
Hallo,

nochmal:
Zitat:
Sind die Vektoren innerhalb einer der 60x1-Zellen alle gleich lang?

Die Screenshots legen das zwar nahe, aber ich möchte jetzt nicht direkt von 2 auf 60 schließen.

Wenn dem so ist, auch nochmal:
Zitat:
dann hilft auf dieser Ebene cell2mat.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 02.02.2020, 15:41     Titel:
  Antworten mit Zitat      
Mit cell2mat komme ich dem Ganzen in der Tat einen ganzen Schritt naeher.
Ein Problem welches sich mir jetzt noch stellt ist wie ich das Ganze in einer Schleife zu einer einzelnen Double Matrix zusammengefasst bekomme. Mit
Code:
count=0;
A=cell2mat(data{1,1});
for i=1:size(data,1)
    count= count+1;
   test(count,:)=cell2mat(data{i,1});
end


Bekomme ich das Problem, dass ich eine Matrix (rechts) habe die immer gleich lang ist und mit einer Matrix (Links) verglichen wird, die reihenweise aufgefuellt werden soll. Wo liegt hier mein Denkfehler?

Beste Gruesse
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.958
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 02.02.2020, 15:58     Titel:
  Antworten mit Zitat      
Hallo,

ohne Daten zur Verfügung zu haben kann ich dir nur empfehlen, das zu tun, was ich auch machen würde: den Debugger verwenden und mir die Dimensionen der beteiligten Variablen ansehen.

Bitte auch die Rückfrage beantworten.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.958
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 02.02.2020, 18:00     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich das richtig sehe, willst du:

Code:
allData = [];
for i=1:size(data,1)
   allData=[allData; cell2mat(data{i,1})];
end


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
RatioTM
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 43
Anmeldedatum: 24.04.18
Wohnort: Genf
Version: ---
     Beitrag Verfasst am: 02.02.2020, 19:11     Titel:
  Antworten mit Zitat      
Hallo,

das ist genau wonach ich gesucht habe, vielen Dank! Das Problem war mir recht fundamental, da ich immer wieder darauf gestossen bin. Ich hatte stets mit

Code:
A=cell2mat(data{1,1});
for i=1:size(data,1)
   test=[A; cell2mat(data{i,1})];
end


versucht zu arbeiten, was jedoch nicht funktioniert hatte. Mein Fehler war also dass ich die zu fuellende Matrix zuvor mit [] definieren muss.

Vielen Dank nochmal!

Beste Gruesse
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 20.958
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2014a
     Beitrag Verfasst am: 02.02.2020, 19:38     Titel:
  Antworten mit Zitat      
Hallo,

das sollte ausgehen, wenn du wirklich mit dem A weiter machst und bei der 2. Iteration anfängst - den ersten Teil hast du ja schon.
Code:
A=cell2mat(data{1,1});
for i=2:size(data,1)
   A=[A; cell2mat(data{i,1})];
end


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.