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

Mehrdim. zu Eindom. Cell Array Eintrag

 

Amin_München
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.12.15
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 12.12.2015, 15:43     Titel: Mehrdim. zu Eindom. Cell Array Eintrag
  Antworten mit Zitat      
Hallo Leute,

ich habe folgende Funktion geschrieben. Database sieht so aus:

Name Size Bytes Class Attributes

database 1x4 38600674 cell

Ist also ein Cell Array mit einem Cell Array der Dimension 1x21578 als ersten Eintrag(database{1}). Dies sind also 21578 Dokumente, welche alle einen Text sprich string enthalten.
Database{2} enthält die Zahl 10. Ich nutze also nur die ersten 10 Dokumente um Laufzeiten zu verkürzen.
Die zwei anderen Felder sind leer.
Code:

function database = TextPreprocessing(database)
delimiter={' ',',','.','!','?'};
for a=1:database{2}
database{3}{a}=strsplit(database{1}{a},delimiter);
end
end
 


Ich will in das noch leere dritte Feld database{3} alle vorkommenden Terme aus den ersten 10 Dokumenten also EINE eindimensionale Zelle also 1x(AlleTermeInDenErsten10Dokumenten) beschreiben.
Wenn ich aber obigen Code ausführe, so erhalte ich zwar alle Terme, jedoch immer in einem ZWEI Dimensionalen Array, sprich database{3}{1} enthält alle Terme vom Dokument 1 und database{3}{2} enthält alle Terme vom Dokument 2.

Was ich aber möchte ist, dass diese Terme alle in einer EIN dimensionalen Zelle also database{3} einfach mit allen Termin gefüllt wird.
Es soll also so sein, dass alle Zelleninhalte in EINE Zelle kommen und "aneinander hängen" wie ein Vektor quasi.

Ich hoffe ihr versteht mein Problem und könnt mir weiter helfen.

LG Amin
_________________

Vielen Dank für eure Hilfe!
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: 12.12.2015, 18:19     Titel: Re: Mehrdim. zu Eindom. Cell Array Eintrag
  Antworten mit Zitat      
Hallo Amin_München,

Zitat:
ich habe folgende Funktion geschrieben. Database sieht so aus:
Name Size Bytes Class Attributes
database 1x4 38600674 cell
Ist also ein Cell Array mit einem Cell Array der Dimension 1x21578 als ersten Eintrag(database{1}). Dies sind also 21578 Dokumente, welche alle einen Text sprich string enthalten.
Database{2} enthält die Zahl 10. Ich nutze also nur die ersten 10 Dokumente um Laufzeiten zu verkürzen.
Die zwei anderen Felder sind leer.

Sag mal, dashat alles mit dem Problem nichts zu tun, oder?

Code:
function database = TextPreprocessing(database)
delimiter = {' ',',','.','!','?'};
n = database{2};
r = cell(1, n);   % EDITED, a -> n
for a = 1:n
  r{a} = strsplit(database{1}{a}, delimiter);
end
database{3} = cat(2, r{:});
end

Gruß, Jan

Zuletzt bearbeitet von Jan S am 13.12.2015, 00:57, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Amin_München
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.12.15
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 12.12.2015, 22:25     Titel:
  Antworten mit Zitat      
Hallo Jan!

Vielen Dank für deine Antwort. Ja genau, das war nur eine Erklärung bzw. Erläuterung zu meinem Problem, anhand deines Codes kann ich erkennen, dass du verstanden hast was mein Problem war. Wenn ich aber deinen Code ausführe, dann gibt es da leider das Problem bei

r = cell(1,a)

denn die Funktion weiß noch gar nicht, wie groß das a ist bzw. a ist in der Zeile noch eine Unbekannt Variable.

Wie kann man das lösen?

LG und vielen Dank schon mal Smile

Amin
_________________

Vielen Dank für eure Hilfe!
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: 13.12.2015, 00:58     Titel:
  Antworten mit Zitat      
Hallo Amin_München,

Das war ein Tippfehler. Ich habe ihn verbessert.
Code:

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Amin_München
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.12.15
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 13.12.2015, 10:32     Titel:
  Antworten mit Zitat      
Viele Dank Jan!
Ich habe es auch so gelöst, falls dich das interessiert.
Man kann auch einfach:

r={};

ein leeres Cell Array erstellen, das würde dann auch gehen Smile

Liebe Grüße
_________________

Vielen Dank für eure Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

nur dass Jans Lösung effizienter ist, da das Array dann nicht mit jeder Iteration der for-Schleife wächst.

Grüße,
Harald
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: 13.12.2015, 22:17     Titel:
  Antworten mit Zitat      
Hallo Amin_München,

Zitat:
Man kann auch einfach ein leeres Cell Array erstellen, das würde dann auch gehen :)

Stimmt, gehen würde es. Aber das wäre ein Standard-Anfänger-Fehler! Wie Haralöd schon sagte, würde dann das Array in jeder Iteration wachsen. Und das benötigt verblüffend viele Resourcen. Ein einfaches Beispiel:
Code:
a = [];
for k = 1:1000
  a(k) = rand;
end

In jeder Iteration wird ein neuer zusammenhängender Block im RAM alloziert mit der neuen Größe und der alte hinein kopiert, bevor das eine neue Element angefügt wird. Das Array hat zum Schluss 1000*8 Byte (da ein Double 64 bit benötigt). Es werden aber wegen des iterativen Anwachsens von Betriebssystem insgesamt sum(1:1000) * 8 Bytes, 8 kB alloziert, also etwas mehr als 4 MB und fast ebenso viel wird noch hin und her kopiert! Bei einer Millionen Elemente geht es dann gleich um 4 TB, das Problem wird also schnell ernst.
Das iterative Wachsen von Arrays ist deshalb ein sehr schlechter Programmierstil und sollte unbedingt durch eine "Pre-Allocation" vermieden werden.

Gruß, Jan
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.