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

je eine Spalte aus vielen Matrizen extrahieren und speichern

 

punsel
Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2008, 13:41     Titel: je eine Spalte aus vielen Matrizen extrahieren und speichern
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem:

Ich habe eine ganze Reihe von Matrizen mit fortlaufendem Index (File0001, File0002, ...), die ich in den Workspace einlese.
Nun moechte ich aus jeder dieser Matrizen mehrmals einen bestimmten Teil einer spalte auslesen. Danach moechte ich diese Spalten unterteilen und die einzelnen Abschnitte ebenfalls speichern.

ich hatte mich bereits an einer "for" Schleife versucht, bin aber da nicht weitergekommen.
Ich muss dazu sagen, dass ich so gut wie keine Erfahrung mit Schleifen und wenig Erfahrung mit MatLab habe...

Hier ein Beispiel:

File0001 = [1 1 1 1 1 1;2 2 2 2 2 2;3 3 3 3 3 3;4 4 4 4 4 4]

File0002 = [5 5 5 5 5 5;6 6 6 6 6 6;7 7 7 7 7 7;8 8 8 8 8 8]

Ich moechte jeweils die erste Spalte auslesen (und abspeichern) - also sollte z.b. herauskommen:

a = [1;2;3;4] % die erste Spalte von File0001 soll als "a" abgespeichert
% werden (das Speichern ist nicht unbedingt noetig)

b = [5;6;7;8] % die erste Spalte von File0002 soll als "b" abgespeichert
% werden (das Speichern ist nicht unbedingt noetig)


Nun moechte ich a und b in gleich grosse Abschnitte unterteilen (in meinemn richtigen Fall sollen diese Abschnitte immer 76 Eintraege lang sein). Diese Abschnitte sollen einzeln unter einem eigenen Namen abgespeichert werden. Es soll also herauskommen:

a1 = [1;2] % der erste Abschnitt aus a soll als a1 abgespeichert
werden
a2 = [3;4]


b1 = [5;6]
b2 = [7;8]

Ich hoffe, ihr koennt mir weiterhelfen... ich bin da an meine Grenzen gestossen und bin schon fast soweit, das ganze fuer 18*200 Matrizen ohne Schleifen auszuschreiben... Sad

Vielen Dank schonmal fuer's lesen Wink
Private Nachricht senden Benutzer-Profile anzeigen


steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 24.01.2008, 15:02     Titel:
  Antworten mit Zitat      
Hallo punsel,

zu deiner ersten Frage:
Auf bestimmte Zeilen oder Spalten von Matrizen zugreifen, ist relativ einfach zu handhaben:
Zitat:

File0001(:,1) % gibt dir die erste Spalte von File0001 aus
File0001(1,:) % gibt dir die erste Zeile von File0001 aus
File0001(2:3,:) % gibt dir eine Matrix bestehend aus der 2. & 3. Zeile von File0001 aus



Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.318
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 24.01.2008, 15:05     Titel:
  Antworten mit Zitat      
Hi,

woher kommen denn die Daten, wie liest Du sie ein?
Müssen die Variablennamen so sein? a, a1 a2 usw...
Guck Dir mal den cell-Datentyp an:
http://www.gomatlab.de/viewtopic,p,1789.html#1789
Zur Not hilft auch eval:
http://www.gomatlab.de/ergebnisse-e.....leife-speichern-t592.html

Zeilen und Spalten kannst Du mit den :-Operator ansprechen.
In Deinem Beispiel:
a=File0001(:,1);

Schreib doch mal, was Du bisher machst.
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
punsel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2008, 15:09     Titel:
  Antworten mit Zitat      
Hei Alex,
danke fuer die Antwort.

Das habe ich allerdings schon herausgefunden.
Auch die weiteren Schritte kann ich ausfuehren. Mein Problem ist eher eine Art Stapelverarbeitung.
Ich habe halt eine Menge recht grosser Matrizen und ich muesste sehr viele einzelne Schritte nacheinander machen. Diese Schritte moechte ich aber nicht alle einzeln aufschreiben, weil mich das Tage kosten wuerde und ich bei neuen Datensaetzen alles wieder per Hand umschreiben muesste... Ich suche also nach einer Moeglichkeit, den Vorgang zu automatisieren. Ich hatte gehofft, man koennte so etwas mit "for" Schleifen machen...?

Ich bin weiterhin fuer jede Hilfe dankbar...
Private Nachricht senden Benutzer-Profile anzeigen
 
steve
Ehrenmitglied

Ehrenmitglied



Beiträge: 2.022
Anmeldedatum: 03.09.07
Wohnort: Wien
Version: R2023b
     Beitrag Verfasst am: 24.01.2008, 15:14     Titel:
  Antworten mit Zitat      
Hey,
das ist im Moment nicht ganz so pauschal zu sagen, ohne zu wissen, wie du bsp. auf deinen Wert 76 kommst Wink

Vllt. hilft dir ja auch folgendes weiter:
http://www.gomatlab.de/vekor-in-kle.....ren-unterteilen-t530.html
Speziell der Post von Bijick am Ende.

Gruß
Alex
_________________

>> I told me to.

____________________________________
Matlab Cheat Sheet
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
punsel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2008, 15:25     Titel:
  Antworten mit Zitat      
Hei nschlange,

auch dir danke fuer die Antwort.

Die Daten sind Matrizen mit den Dimensionen 4851 x 9 und kommen von einer externen Anwendung. Ich lese die Matrizen als ascii-Daten ein:

d=dir('F:\Lader2007\Turbulenz\*.txt') % alle entsprechenden Daten werden in
% d zusammengefasst

for i=1:length(d)
eval(['load' d(i).name ' -ascii'])
end % alle in d erfassten Daten werden
% geladen

Dann habe ich also die Matrizen im Workspace. Das ist, wo der ganze Spass anfaengt Wink

Nun moechte ich eine Spalte jeder Matrix extrahieren. Ich koennte das also so schreiben:

u01=File0001(77:152,3) % extrahieren der Eintraege 77 bis 152 aus der
% dritten Spalte

Ich moechte aber aus der gleichen Spalte oefter Eintraege extrahieren, also muesste ich diesen Schritt haeufiger, aber mit unterschiedlichen Eintraegen in den Klammern ausfuehren:

u02=File0001(153:228,3) % extrahieren der Eintraege 153 bis 228 aus der
% dritten Spalte

u03=File0001(229:304,3) % extrahieren der Eintraege 229 bis 304 aus der
% dritten Spalte


usw...


Aber weil das noch nicht genug ist, moechte ich nun das ganze mit sehr vielen Matrizen machen (Namen der Matrizen: File0001, File0002, File0003, ...).

Danach werde ich dann mit den extrahierten Daten weiterrechnen. Das heisst, ich muss die einzelnen Abschnitte der Spalten speichern (in meinem Beispiel sind das also u01, u02, u03, ...).

Die Namen der Variablen muessen uebrigens nicht so lauten. Jeder Name ist ok. Nur die urspruenglichen Daten (File0001, ...) moechte ich nicht umbenennen.

Ich hoffe, das ist klar genug geschrieben und du verstehst mein Problem?

EDIT by Martin: Herzlichen Glückwunsch zu 2.000sten Beitrag Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
punsel
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 27
Anmeldedatum: 23.01.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.01.2008, 15:34     Titel:
  Antworten mit Zitat      
Hei Alex,

da brauche ich ein bisschen laenger, das nachzuvollziehen...

Auf die 76 komme ich, weil die Daten aus einem Grid kommen, dessen eine Seite aus 76 Datenpunkte besteht Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
nschlange
Ehrenmitglied

Ehrenmitglied



Beiträge: 1.318
Anmeldedatum: 06.09.07
Wohnort: NRW
Version: R2007b
     Beitrag Verfasst am: 24.01.2008, 17:34     Titel:
  Antworten mit Zitat      
punsel hat Folgendes geschrieben:


u01=File0001(77:152,3) % extrahieren der Eintraege 77 bis 152 aus der
% dritten Spalte

Ich moechte aber aus der gleichen Spalte oefter Eintraege extrahieren, also muesste ich diesen Schritt haeufiger, aber mit unterschiedlichen Eintraegen in den Klammern ausfuehren:

u02=File0001(153:228,3) % extrahieren der Eintraege 153 bis 228 aus der
% dritten Spalte

u03=File0001(229:304,3) % extrahieren der Eintraege 229 bis 304 aus der
% dritten Spalte


Woher/wann weißt Du, welche Einträge Du brauchst?
Evtl. kannst Du die Indizes der benötigten Elemente für jede Variable
File00** speichern, und dann in einer for-Schleife über alle File00**
iterieren und die entsprechenden Elemente extrahieren.
_________________

Viele Grüße
nschlange

"Chuck Norris ejakuliert fluessigen Stahl!"
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Michaela
Forum-Century

Forum-Century


Beiträge: 239
Anmeldedatum: 12.07.07
Wohnort: ---
Version: bis 2007b
     Beitrag Verfasst am: 24.01.2008, 19:03     Titel:
  Antworten mit Zitat      
Hallo punsel,

mit welchem Programm willst Du denn die endgültige Auswertung der Daten durchführen? Mit Matlab?
Dann wäre es evtl. günstiger statt vieler einzelner Files gleich die variabelnstruktur von matlab zu nutzen und vielleicht alle Daten aus einer Datei in einem struct oder cell array abzuspeichern.

zum beispiel sowas

Code:

A{1}.ursprungsname = 'file00001';
A{1}.ursprungdaten = einlesen(file00001); % ursprüngliche Matrix
A{1}.zeilenzumauslesen = [77 152 3; 153 228 3; 229 304 3;] %kann je nach Datei und spalte modifzierrt werden

 


Dann kannst Du dir eine funktion schreiben, der du A übergibst und die dann die einzelnen Vektoren rausholt zB

Code:

function  A = extrahieren(A)
for jj = 1:length(A)
for ii = 1:size(A{jj}.zeilenzumauslesen,2)
   A{jj}.extract{ii} = A{jj}.ursprungsdaten([A{jj}.zeilenzumauslesen(1,ii) :A{jj}.zeilenzumauslesen(2,ii)],A{jj}.zeilenzumauslesen(3,ii) ) % zB 153: 228 ,3

end
end
 

In dem cell A{jj}.extract stehen nun alle Einzelvektoren.

Der Vorteil dieses Vorgehens: dadurch dass alles in einer Variablen ist, kannst Du auch später noch Herkunft und Herstellung der Daten nachvollziehen, auch sparst Du dir viele mühevolle Einleseroutinen.

Falls Du die Daten extern weiterverarbeiten möchtest, dann solltest Du dir überlegen ob Du nicht auf eine Sprache umsteigst, die für file-I/O gedacht ist. also zB perl phython etc. Das ist einfacher und schneller als mit matlab, vor allem da du dich in matlab ja auch einarbeiten musst. FAlls Du nur matlab hast: eine Umsetzung ist sicherlich möglich, aber eben nicht so elegant und schnell.
_________________

---------------------------------------------------------------
Leider habe ich daheim zwar Internet aber kein Matlab - daher sind alle Syntaxbeispiele circa Angaben.....
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 - 2024 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.