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

Cell Array umstrukturieren

 

Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 12:04     Titel: Cell Array umstrukturieren
  Antworten mit Zitat      
Hi,

ich habe einen Cell-Array der folgendermaßen aufgebaut ist:
Code:
temp <1x26 cell>

In jedem dieser 26 Zellen stecken etwa 600 T Werte (1:2 = Worte, 3:26 = Zahlen).

Mein Ziel ist es folgendes zu erhalten (aus den Zellen 3 bis 26):
Code:
x <600000x24 cell>

Habe es aber bisher nur folgendermaßen hinbekommen:
Code:
x=num2cell([temp{3:26}]);

Gibt es eine andere Möglichkeit? Ist ja blöd die Werte erst umzuwandeln und dann wieder in einen Cell-Array zu wandeln (zumal das knapp 6 Sekunden dauert).

Vielen Dank. Smile


Harald
Forum-Meister

Forum-Meister


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

Gegenfrage: warum willst du deine Daten unbedingt als Cell Array in dieser Form haben? Damit lässt sich ja nur schwer etwas anfangen, z.B. kann man keine Berechnungen darauf durchführen.
Was spricht also dagegen, die Daten numerisch zu speichern?

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 12:47     Titel:
  Antworten mit Zitat      
Hi,

die Werte brauche ich deshalb als Cell damit ich die Daten mit zwei weiteren Cell zu einer Cell kombinieren kann um diese dann mittels xlswrite zu exportieren.

Die drei einzelnen Cell sind:
1x25 (Spaltenüberschriften)
600Tx1 (Zeistempel (Datum und Uhrzeit))
600Tx25 (Werte)

Ich könnte die Werte auch nacheinander in ein Excel-File schreiben aber das nimmt unnötig lange Zeit in Anspruch. Darum soll zuvor ein output-cell erstellt werden.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 12:51     Titel:
  Antworten mit Zitat      
Kleiner Fehler: Die Werte sind natürlich 600Tx24 statt 600Tx25.
 
Harald
Forum-Meister

Forum-Meister


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

eine Möglichkeit wäre, mit xlswrite1 aus File Exchange zu arbeiten. Das sollte die Performance-Probleme bei mehrfachem Schreiben zumindest lindern.

Eine andere Möglichkeit wäre, einen Table (ab 2013b) bzw. ein Dataset Array (auch vor 2013b, in der Statistics Toolbox) zu erstellen. Dann können die Daten bequem mit writetable bzw. export nach Excel geschrieben werden.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 13:28     Titel:
  Antworten mit Zitat      
D.h. es gibt keinen anderen Weg als per:
Code:
x=num2cell([temp{3:26}]);

die Daten umzuwandeln? Also aus einem Cell-Array wieder einen Cell-Array zu kreieren dessen Form sich halt gewandelt hat?
 
Harald
Forum-Meister

Forum-Meister


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

nicht, dass ich wüsste.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 17:22     Titel: xlswrite1
  Antworten mit Zitat      
Das ist sehr schade. Dann ist die Alternative wohl wirklich nur xlswrite1.

Allerdings: Kann es sein, dass xlswrite1 keine xlsx schreiben kann!?

Code:
Excel = actxserver ('Excel.Application');
File='S:\FH-Studium\Semester 6\Labor Modellbildung\MATLAB\test.xlsx';
if ~exist(File,'file')
    ExcelWorkbook = Excel.workbooks.Add;
    ExcelWorkbook.SaveAs(File,1);
    ExcelWorkbook.Close(false);
end
invoke(Excel.Workbooks,'Open',File);

xlswrite1(File,data(1:50000,:)); % nur zum test die einschränkung

invoke(Excel.ActiveWorkbook,'Save');
Excel.Quit
Excel.delete
clear Excel

Fehler:
Code:
Error using Interface.Microsoft_Excel_14.0_Object_Library.Workbooks/Open
Invoke Error, Dispatch Exception:
Source: Microsoft Excel
Description: Die Datei 'test.xlsx' kann von Excel nicht geöffnet werden, da das Dateiformat oder die
Dateierweiterung ungültig ist. Überprüfen Sie, ob die Datei beschädigt ist und ob die Dateierweiterung dem
Dateiformat entspricht.
Help File: xlmain11.chm
Help Context ID: 0

Error in xlswrite1_start (line 8)
invoke(Excel.Workbooks,'Open',File);
 
Harald
Forum-Meister

Forum-Meister


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

xlswrite1 ist von 2006, das ist also naheliegend.

Du findest in den Referenzen von xlswrite1 aber ein xlswrite2007, und damit sollte es gehen.
http://www.mathworks.com/matlabcent.....change/25288-xlswrite2007

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 22:53     Titel:
  Antworten mit Zitat      
Hi,

vielen Dank. Hab es nun darüber gelöst aber es wäre dennoch sehr interessant, ob es eine Möglichkeit gibt einen Cell-Array so umzuwandeln. Muss ja eigentlich ohne den Umweg funktionieren.

VG Sven
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.01.2014, 00:10     Titel:
  Antworten mit Zitat      
Hallo Sven,

Im FileExchange findest Du auch noch: http://www.mathworks.com/matlabcent.....31105-write-data-to-excel und http://www.mathworks.com/matlabcent.....sfer-matlab-%3C-%3E-excel .

Ich grübele immer noch, wie die Orginal-Daten genau aussehen. "temp <1x26 cell> " ist klar, aber was genau bedeutet "In jedem dieser 26 Zellen stecken etwa 600 T Werte (1:2 = Worte, 3:26 = Zahlen)"?

Da NUM2CELL auch nur einfache Schleifen enthält, kannst Du das auch gleich direkt machen.
Am besten erzeugst Du direkt das entgültig benötigte CELL-Array:
Code:
C = cell(600001, 25);
C(1, :) = ... Die Header-Zeile
for k2 = 2:25
  D = In{k2};
  for k1 = 1:60000
    C{k1 + 1, k2} = D(k1);
  end
end

Das ist nur ein grober Tipp, weil ich durch die Inputs nicht ganz durchsteige. Aber das könnte die das zeitraubende Erzeugen des großen numerischen Arrays vermeiden.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.01.2014, 20:16     Titel:
  Antworten mit Zitat      
Hi,

schonmal Danke für deinen Beitrag.

Die Zellstruktur schaut zunächst so aus (nach "textscan"):
Code:
temp <1x26 cell>

Wendet man folgendes an:
Code:

Erhält man:
Code:
<693397x1 double>

Das meinte ich mit 600T Werte in jedem Cell. Ich muss aber auch sagen, dass ich bei Cell-Arrays noch nicht richtig durchgestiegen bin (scheint ja man könne cell in cell in cell usw. usw.).

Für den Export nutze ich momentan "xlswrite2007.m" weil die Daten in mehreren Anläufen geschrieben werden (jedes mal das File erneut öffnen würde zuviel Zeit in Anspruch nehmen).

Wie bei "xlswrite1" sind auch bei "xlswrite2007" vor und nach dem Schreiben einige Zeilen notwendig ... die wollte ich einfach nicht im Skript haben und hab es deshalb folgendermaßen modifiziert (ist so aber auch Recht blöd):

Funktion "xlswrite2007B.m":
Code:
function output = xlswrite2007B()
output{1}= @xlswrite_initalize;
output{2}= @xlswrite2007;
output{3}= @xlswrite_deinitalize;

function xlswrite_initalize(File)
assignin('base','Excel',actxserver('Excel.Application'))        % Excel = actxserver('Excel.Application');

if ~exist(File,'file');  
evalin('base','ExcelWorkbook = Excel.workbooks.Add;');          % ExcelWorkbook.SaveAs(File);
evalin('base','ExcelWorkbook.SaveAs(File);');                   % ExcelWorkbook.SaveAs(File);
evalin('base','ExcelWorkbook.Close(false);');                   % ExcelWorkbook.Close(false);
end

evalin('base','ExcelWorkbook = Excel.workbooks.Open(File);'); % ExcelWorkbook = Excel.workbooks.Open(File);

function xlswrite_deinitalize()
evalin('base','ExcelWorkbook.Save');
evalin('base','ExcelWorkbook.Close(false)');
evalin('base','Excel.Quit');
evalin('base','delete(Excel)');

function [success,message]=xlswrite2007(file,data,sheet,range)
(...) (eigentlicher Code von xlswrize2007)


Ich wollte damit erreichen, dass der Quellcode zum Öffnen eines Files nicht im Skript sondern der Funktion steht.

Der Aufruf erfolgt dann so (aus einem Skript heraus):
Code:
xlswrite2007=xlswrite2007B();
xlswrite2007{1}(File) % Excel öffnen
xlswrite2007{2}(File,caption,['Tabelle',num2str(k)],'A1'); % Daten schreiben
xlswrite2007{3}() % Excel schließen


>>Mich stört einfach, dass der Quellcode durch Anwendung von "xlswrite2007" deutlich umfangreicher als bei "xlswrite" wird. Am liebsten wäre mir, dass xlswrite2007 bei erstmaligem Schreiben von selbst eine Datei öffnet etc. und nur für das Beenden des Schreibens ein weiterer Befehl notwendig ist.
 
Harald
Forum-Meister

Forum-Meister


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

eine Möglichkeit: eine persistent Variable anlegen, mit der du kontrollierst, ob die Datei bereits geöffnet wurde. Allerdings muss man dann auch darauf achten, dass die Datei, wenn man damit fertig ist, ordnungsgemäß geschlossen wird.

Ja, das ist nicht wirklich schön. xlswrite ist ja auch komfortabler, nur eben bei wiederholten Schreibzugriffen langsamer.

Übrigens: Cell Arrays sind in der Form, wie du das ursprünglich wolltest, recht speicherineffizient - man hat ja für jede Zahl nochmal einen Zeiger darauf. Das sieht man, wenn man sich im Workspace Browser mal "Bytes" anzeigen lässt (auswählbar z.B. über Rechts-Klick auf 'Name').
Eine Alternative wären wie gesagt Tables bzw. Dataset Arrays.

Grüße,
Harald
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.