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

Problem mit cat

 

JN78
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 10.08.2010, 13:05     Titel: Problem mit cat
  Antworten mit Zitat      
Hallo,

ich hab folgendes Problem:
Ich habe einige hundert Variablen/Vektoren die ich zusammenfügen möchte.
Der Namen baut sich wie folgt auf: "file1_spalte_1", "file1_spalte2", etc. insgesamt gibt es in dieser Form jede Menge Files mit jeweils den Spalten 1-248, ich hoffe es ist verständlich wie ich das meine.

Ich möchte nun gerne die einzelnen Spalten zusammenfassen, damit ich mir das besser plotten lassen kann. Also alle "Spalten1" zusammengefasst, alle "Spalten26" usw.
Es sollte in der Art c = [a;b] ja klappen, ich hab das dann in form einer Schleife realisieren wollen:

Code:

for n=1:25
    for i=1:248
     assignin('base',['spalte_',num2str(i)], ['file',num2str(n),'_spalte',num2str(i);  'file',num2str(n+1),'_spalte',num2str(i)]);
    end
end
 


Zitat:
Fehlermeldung:
??? Error using ==> vertcat
CAT arguments dimensions are not consistent.

Error in ==> test at 3
assignin('base',['spalte_',num2str(i)], ['file',num2str(n),'_spalte',num2str(i); 'file',num2str(n+1),'_spalte',num2str(i)]);



Die Dimensionen der Variablen sind identisch!
Hat jemand einen Lösungsvorschlag?

Gruß Jan

Edit by denny: Bitte die Code-Formatierung verwenden. Danke!
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



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

du muss aufpassen, du hast unterschiedliche Anzahl von Ziffern, dass du zusammenfassen willst.

so läuft es durch:
Code:

for n=1:25
    for i=1:248
     assignin('base',sprintf('spalte_%d',i), char({sprintf('file%d_spalte%d',n,i);  sprintf('file%d_spalte%d',n+1,i)}));
    end
end
 
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: 10.08.2010, 18:24     Titel: Re: Problem mit cat
  Antworten mit Zitat      
Hallo Jan 78,

Ich rate sehr gerne von ASSIGNIN (und EVAL) ab. Hier ein weitere Grund dafür:
JN78 hat Folgendes geschrieben:
Code:

for n=1:25
    for i=1:248
     assignin('base',['spalte_',num2str(i)], ['file',num2str(n),'_spalte',num2str(i);  'file',num2str(n+1),'_spalte',num2str(i)]);
    end
end
 

Was möchtest Du erreichen? ASSIGNIN verschleiert das so gut, dass man leicht aus den Augen verliert, was eigentlich passiert:
Zunächst erzeugst Du ein CHAR Array, wobei eine Fehlermeldung erscheint, weil die beiden Zeilen unterschiedlich lang sind, falls n und n+1 unterschiedlich viele Ziffern haben:
Code:

Str = ['file',num2str(n),'_spalte',num2str(i);  'file',num2str(n+1),'_spalte',num2str(i)]

Für n=1 läuft es aber. Das CHAR Array ist dann:
Code:
Str = ['file1_spalte1'; 'file2_spalte1']

Dieses CHAR Array wird dann per ASSIGNIN im Base-Workspace der Variablen "spalte_1" zugewiesen.
Möchtest Du das? Oder soll "spalte_1" andere Werte enthalten? Aus dem Programm wird das nicht ersichtlich.

Deshalb, ich wiederhole mich ja ganz gerne, rate ich ausdrücklich von ASSIGNIN (und EVAL, EVALIN und anderen Code-Obfustcation-Techniken) ab.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
JN78
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 10.08.2010, 22:45     Titel:
  Antworten mit Zitat      
Hallo Jan,

also ich möchte eigentllich die verschiedenen Inhalte von "filex_spalte_1" in "spalte1" schreiben, dann eins weiterzählen und wieder die inhalte der variablen "filex_spalte_y" in dementsprechend "spalte_y" schreiben.

wenn nicht assignin, was sollte ich denn dann besser nehmen. von eval bin ich nun weg, dank deiner hinweise. hoff ich jedenfalls Wink

Gruß Jan
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: 10.08.2010, 23:19     Titel:
  Antworten mit Zitat      
Hallo Jan 78,

sorry für die Nummerierung, ich möchte nur die Verwirrung reduzieren.

Du kannst die verschiedenen Variablen als Felder eines Structs definieren:
Code:
for i = 1:10
  for j = 1:10
    S.(sprintf('file%d_spalte%d', i, j)) = rand(1, 5);
  end
end

Das nennt man "dynamic field names".
Aber eigentlich wäre es besser, die Indizierung nicht in den Namen der Felder zu packen - ich Benutze ja auch nicht meine Telefonnummer als Nachname, obwohl das auch ein paar Vorteile hätte. Als Indizierung könnte man ganz hervorragend --- Inidzes verwenden:
Code:

C = cell(10, 10);
for i = 1:10
  for j = 1:10
    C{i, j} = rand(1, 5);
  end
end

Wenn die Daten (hier halt nur sinnlose Testdaten) alle die gleiche Größe und den gleichen Typ haben, wäre ein Array noch besser (also schneller und klarer).
Das Zusammenfassen wird dann sehr einfach.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
JN78
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 11.08.2010, 08:30     Titel:
  Antworten mit Zitat      
Hallo Jan,

ich habe deinen Vorschlag mal eben probiert, klappt bis auf die Tatsache das in die Felder nur der Arrayname und nicht der Inhalt geschrieben wird.
Also statt Zahlen stehen dann leider die bisherigen Bezeichnungen also "file3_spalte45" drin und nicht die 30.000 Werte die drin stehen und die ich eigentlich übergeben möchte.

JN
Private Nachricht senden Benutzer-Profile anzeigen
 
JN78
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 11.08.2010, 10:37     Titel:
  Antworten mit Zitat      
Hallo,

so ich hab mein Problem gelöst. Ich hab nun geschnallt wie ich mit dem dynamic field names umgehen muss. Ist wirklich viel leichter als ich dachte und das reduziert meinen Code ungemein.

Danke nochmals
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.