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).
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
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.01.2014, 12:47
Titel:
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: ---
Verfasst am: 01.01.2014, 12:51
Titel:
Kleiner Fehler: Die Werte sind natürlich 600Tx24 statt 600Tx25.
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.
Error using Interface.Microsoft_Excel_14.0_Object_Library.Workbooks/Open InvokeError, 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 (line8) invoke(Excel.Workbooks,'Open',File);
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.
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
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 02.01.2014, 20:16
Titel:
Hi,
schonmal Danke für deinen Beitrag.
Die Zellstruktur schaut zunächst so aus (nach "textscan"):
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
>>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.
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
Einstellungen und Berechtigungen
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
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.