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

Matrix aus Vektoren erstellen

 

hanson
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 25.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 15:40     Titel: Matrix aus Vektoren erstellen
  Antworten mit Zitat      
Hallo zusammen,

Da ich neu hier bin, möchte ich mich zuerst kurz vorstellen:
Mein Name ist Hannes, ich bin 26 und schreibe im Moment meine Diplomarbeit auf dem Gebiet Thermodynamik/Brennverfahrensentwicklung Ottomotoren. Im Zuge dessen habe ich jetzt auch erstmals aktiv mit Matlab zu tun. Die Grundlagen habe ich mir schon zu Gemüte geführt.
Ich stoße beim Thema "structs" jetzt aber auf ein Problem, das ich anhand eines Beispiels erläutern möchte:

Ich habe den folgenden struct vorliegen:
Code:
signals.name.A = 'Strom';
signals.name.B = 'Drehzahl';
signals.name.C = 'Drehmoment';

signals.data.A = [1; 4; 5; 8];
signals.data.B = [1.2; 11; 7; 1];
signals.data.C = [5; 1.1; 7; 2];
 


Nun möchte ich die Vektoren, die in signals.data stehen, zu einer Matrix (data) zusammenfassen, die die folgende Form hat:
Code:
data = [signals.data.A, signals.data.B, signals.data.C]


Da das Ganze dynamisch geschehen soll, habe ich mir diese for-Schleife überlegt:
Code:
flds = fieldnames (signals.name)
for iSig = 1 : length (flds);
     data (:, iSig)= [signals.data.(flds{iSig})];
end


Leider bekomme ich beim Ausführen die Fehlermeldung

Subscripted assignment dimension mismatch.



Später möchte ich zudem das gleiche für die Namen aus signal.name machen, also analog:
Code:

data = [signals.name.A, signals.name.B, signals.name.C]


bzw. als for-Schleife

Code:
flds = fieldnames (signals.name)
for iSig = 1 : length (flds);
     names (:, iSig) = [signals.name.(flds{iSig})];
end



Ich hoffe, dass ich mein Problem verständlich vorgebracht habe und würde mich freuen, wenn mir jemand weiterhelfen könnte.


Viele Grüße,
hannes

Zuletzt bearbeitet von hanson am 25.07.2012, 16:28, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Kascho
Forum-Century

Forum-Century


Beiträge: 195
Anmeldedatum: 24.03.10
Wohnort: Jena
Version: R2008b ... :(
     Beitrag Verfasst am: 25.07.2012, 16:13     Titel:
  Antworten mit Zitat      
Hallo Hanson und Willkommen im Forum,

ich kann deinen Fehler mit diesen Beispieldaten nicht Reproduzieren. Bei mit tut deine Schleife was sie (wahrscheinlich) soll.

Kann es sein das die Variable "data" schon irgendwo existiert und ein andere Typ als 4x3 double ist?

Setz doch mal ein "clear data" vor die Schleife.

Wenn nicht, liegen deine Daten wirklich nach dem Schema vor? Also in A,B und C jeweils gleich viele Elemente?

Gruß, Kascho
Private Nachricht senden Benutzer-Profile anzeigen
 
hanson
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 25.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 16:28     Titel:
  Antworten mit Zitat      
Hi Kascho,

Vielen Dank für deine Antwort. Du hattest Recht, die Variable "data" bestand zu diesem Zeitpunkt schon. Ich hatte mich noch gewundert, weil als ich die Schleife bei mir auch noch funktioniert hatte, als ich sie das erste Mal ausprobiert hatte.

Allerdings besteht das Problem bei meinem zweiten Vorhaben
Code:
flds = fieldnames (signals.name)
for iSig = 1 : length (flds);
     names (:, iSig)= [signals.name.(flds{iSig})];
end
weiterhin.

Ich gehe davon aus, dass es daran liegt, dass es sich hier bei den zu verarbeitenden Daten um Strings handelt. Wie bringe ich Matlab denn dazu, dass die Variable "names", die erstellt werden soll keinen String darstellt, sondern eine Matrix (cell?), in deren Spalten die Strings "signals.name.A/B/C" stehen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Kascho
Forum-Century

Forum-Century


Beiträge: 195
Anmeldedatum: 24.03.10
Wohnort: Jena
Version: R2008b ... :(
     Beitrag Verfasst am: 25.07.2012, 16:49     Titel:
  Antworten mit Zitat      
Hallo nochmal Hanson,

das Problem liegt eher darin das es chars sind. Also jedes Zeichen einzeln.
So würde es funktionieren:

Code:

flds = fieldnames (signals.name)
for iSig = 1 : length (flds);
     names(iSig,1:length(signals.name.(flds{iSig})))= [signals.name.(flds{iSig})];
end
 



*edit: Upsa, hab deine letzte Zeile irgendwie überlesen, mit Cells wäre das wesentlich einfacher, da musst du geschweifte Klammern nutzen, also so:

Code:

flds = fieldnames (signals.name)
for iSig = 1 : length (flds);
     names{iSig}= [signals.name.(flds{iSig})];
end
 


Gruß, Kascho
Private Nachricht senden Benutzer-Profile anzeigen
 
hanson
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 25.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 17:08     Titel:
  Antworten mit Zitat      
Ach, perfekt!
Und das Ganze nur durch {} statt ()... Very Happy

Vielen Dank, Kascho!
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2012, 22:20     Titel:
  Antworten mit Zitat      
Hallo Hannes,

viele Aufgaben lassen sich leichter lösen, wenn man statt Namen für einzelne Elemente
Felder mit Indizes benutzt.
In Deinem Fall also statt A, B, C, ... 1,2, und 3.
Ein struct kann genauso über Indizes angesprochen werden wie eine Matrix oder ein Cell-Array. Nur dass statt einer Zahl komplexere Elemente mit z.B. name und data in jedem Eintrag stecken:
Code:
signals(1).name = 'Strom'; signals(1).data = [1; 4; 5; 8];
signals(2).name = 'Drehzahl'; signals(2).data = [1.2; 11; 7; 1];
signals(3).name = 'Drehmoment'; signals(3).data = [5; 1.1; 7; 2];

Dann kannst Du ganz einfach auf das selbe Feld aller Einträge zugreifen:
Code:
names={signals.name};
data=[signals.data];


Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
hanson
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 25.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2012, 16:38     Titel:
  Antworten mit Zitat      
Hallo sirius,

Danke für den Tipp. Ich habe mich aber bewusst für die andere Variante entschieden, da ich in meinen wirklichen Messdaten deutlich mehr als die drei im Beispiel angegebenen Größen habe (ca. 50-100).
Da ist meiner Meinung nach die Variante, wie ich sie benutze, sinnvoller, da ich auf den ersten Blick sehe, wo sich meine Größe befindet. In deiner Version müsste man ja erst alle 50-100 structs durchsuchen.

Real sehen meine struct dann ungefähr so aus:
Code:

signals.name.I_Inj = 'Injektorstrom';
signals.name.n = 'Drehzahl';
signals.name.M = 'Drehmoment';
signals.name.pS = 'Saugrohrdruck';
signals.name.n_turb = 'Drehzahl Turbolader';
signals.name.pmi = 'indizierter Mitteldruck';
.
.
.

signals.name.I_Inj = [1; 4; 5; 8];
signals.name.n = [1.2; 11; 7; 1];
signals.name.M = [5; 1.1; 7; 2];
signals.name.pS = [3; 4.1; 44; 7];
signals.name.n_turb = [53; 13.1; 17; 2.2];
signals.name.pmi = [2; 1; 5; 0.2];
.
.
.

signals.unit.I_Inj = 'A';
signals.unit.n = '1/min';
signals.unit.M = 'Nm';
signals.unit.pS = 'mbar';
signals.unit.n_turb = '1/min';
signals.unit.pmi = 'bar';
.
.
.
 
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.