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

Vektor hinter die bisherige Matrix setzen

 

Pabrelin
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 26.04.2016, 11:18     Titel: Vektor hinter die bisherige Matrix setzen
  Antworten mit Zitat      
Hallo zusammen,

ich hab ein Problem was mir sehr einfach erscheint, vielleicht finde ich deswegen keine Beiträge dazu. Also:

Ich schreibe ein Programm, welches sich aus einer Messdatei (Sinusverlauf von Drehmoment und Drehwinkel) bestimmte Daten sucht. Genauer gesagt suche ich die Daten vom Nulldurchgang (nach einem Minimum) zum nächsten Maximum (des Winkels). Da die Daten einen Sinusverlauf haben gibt es diese Verlauf mehrmals (etwa 25 mal). Das Programm habe ich soweit fertig, dass ich die Daten bekomme: ich habe am ende einer Schleife einen Vektor mit Moment und einen Vektor mit Drehwinkel für einen der 25 Verläufe.
Mit "einer Schleife" meine ich, dass das Programm nacheinander die 25 Teilabschnitte abläuft und dies eben mit einer Schleife getan wird.

Jetzt kommt auch endlich mein Problem:
Ich würd gern am Ende einer Schleife die beiden Vektoren in eine Matrix speichern, und bei der nächsten Schleife (also dem nächsten gesuchten Verlauf von null->max) die neuen beiden Vektoren hinter die bisherige Matrix dranhängen.
Ich stell mir das so vor, dass ich am Ende des Programmes eine Datei (ob excel, .mat, .dat ist glaub ich nicht so wichtig) abspeichere, die die Matrix mit 50 Spalten enthält damit ich diese in einem anderen Programm weiterverwenden kann.

Ich hoffe, dass ich alle Infos hier untergebracht habe (und nicht zu viele unnötige).

Gruß
Pabrelin
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: 26.04.2016, 13:24     Titel: Re: Vektor hinter die bisherige Matrix setzen
  Antworten mit Zitat      
Hallo Pabrelin,

Was hast Du bisher versucht und was funktioniert noch nicht?
Du berechnest in jeden Schleifen-Durchgang zwei Vektoren (wie auch immer) und möchtest sie in einer Matrix speichern. Dann mache das doch.
Wo liegt genau das Problem? Weißt Du, wie man Vektoren in einer Matrix speichert?
Code:
n = 25;
M = zeros(3, 2, n);  % einfach als 3D-Array
for k = 1:n
  vektor1 = rand(3, 1);  % Irgendwelche Beispieldaten
  vektor2 = rand(3, 1);
  M(:, 1, k) = vektor1;
  M(:, 2, k) = vektor2;
end

% Dann als Matrix umformen:
M = reshape(M, 3, 2*k);

Hilft das bereits weiter?

Wenn Du Deinen bisherigen Code postest, ist es einfacher ihn zu erweitern.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 26.04.2016, 14:16     Titel:
  Antworten mit Zitat      
Das hat mir schonmal sehr weiter geholfen.

Leider ist in M nur der letzte Vektor mit Werten gefüllt, alle vorherigen mit Nullen. Könnte das daran liegen, dass die Vektoren nicht gleich lang sind?

Ich versuch mal die wichtigen Zeilen meines Codes hier darzustellen:
Code:

for e= 1 : c-1    % c-1 ist bei meiner Messdatei 25, aber will es allgemein halten

% Hier ist ein langer Abschnitt wo ich Minima, Maxima und Nullstellen herausarbeite
% Die Anzahl an Messwerten zwischen Null und Max ist l-1  (klein L)
% (wegen der Schleife wurde im letzten Schritt l = l +1 addiert, sodass  es l-1 Werte gibt)

phi =[]  % phi ist ein ca 250-300 Zeilen langer Spaltenvektor mit Werten von 0 bis 23
T = [] % phi ist ein ca 250-300 Zeilen langer Spaltenvektor mit Werten von 0 bis 750
% Jetzt die von dir vorgeschlagene Speicherung und Formatierung
Daten = zeros (l-1, 2, c-1);
Daten (:, 1, e) = phi;
Daten (:, 2, e) = T;

end
Daten = reshape (Daten, l-1, 2*(c-1));
dlmwrite('data_beginn.csv',[Daten],'delimiter',';','newline','pc');

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Pabrelin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 26.04.2016, 14:27     Titel:
  Antworten mit Zitat      
Oh man, was für eine Fehler Rolling Eyes
Darf die Erstellung der zero matrix natürlich nicht in die Schleife nehmen...

Habe nun den Fehler "Subscripted assignment dimension mismatch." bei
Code:

Daten(:, 1, e) = phi;
 

das bedeutet ja, dass die Anzahl der Zeilen von "Daten" und "phi" nicht übereinstimmt.
Das weiß ich und kann ich kaum ändern, kann ich das Problem irgendwie umgehen?
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: 26.04.2016, 15:33     Titel:
  Antworten mit Zitat      
Hallo Pabrelin,

Was bedeutet "phi ist ein ca 250-300 Zeilen langer Spaltenvektor mit Werten von 0 bis 23" genau? Sind alle Vektoren gleich lang oder nicht? Wenn nicht, kann man sie nicht in einer Matrix speichern. Dann würdest Du ein Cell-Array benötigen.
Code:
Daten = cell(2, c-1);
for e = 1 : c-1
  Daten{1, e} = phi;
  Daten{2, e} = T;
end

Dann wird aber DLMWRITE nicht direkt funktionieren. Wie soll denn der Output aussehen, wenn die Vektoren nicht gleich lang sind?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 26.04.2016, 15:48     Titel:
  Antworten mit Zitat      
Bei dem Versuch geht es darum, dass ein Werkstück über langen Zeitraum beansprucht wird (mit einem Drehmoment). Die Materialeigenschaften ändern sich und der maximale Winkel ändert sich, sowie die Dauer in denen der Maximalausschlag erreicht wird.
Ich habe mir mal die Anzahl der Zeilen ausgeben lassen, aus der die 25 Schleifen bestehen: 258, 256, 261, 265, 257, 272,... , 309.

In jeder Schleife werden die Messdaten bei einem Winkel von 0° bis zum maximalen Ausschlag (ca. 23°) gespeichert.

Mein Ziel ist eben eine Datei auszugeben, in der ich in der 1. Spalte den Winkelverlauf der 1. Schleife speichere und in der 2. Spalte den dazugehörigen Momentenverlauf. Und in Spalte 3 und 4 dementsprechend die Daten der 2. Schleife, usw.

Wo ich so drüber nachdenke, könnte ich die Anzahl der Messwerte so anpassen, dass alle Vektoren die gleiche Größe haben (gleiche Anzahl der Messwerte), wenn du/ihr also meint, dass das die Sache wesentlich einfacher macht.
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: 26.04.2016, 16:52     Titel:
  Antworten mit Zitat      
Hallo Pabrelin,

Eine Text-Datei, in der die Spalten unterschiedliche Länge haben, ist reichlich unpraktisch. Ist es überhaupt notwendig, das als Text zu schreiben? Ein MAT-File wäre viel praktischer und eleganter, wenn es nicht direkt von einem Menschen gelesen oder editiert werden muss.

Per interp1 könntest Du die Messdaten alle auf die selbe Länge bringen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 26.04.2016, 18:27     Titel:
  Antworten mit Zitat      
Hab in meinem ersten Beitrag mal gesagt, dass mir das Format egal ist. Speicher es nun also in .mat ab.

Zu Interp1 hab ich mich ein wenig durch Beiträge gelsen und Jan, du hast zu einem Kommentar geantwort "INTERP1 macht genau was es soll: Wenn man eine Funktion auf einer Untermenge der Stützstellen interpoliert, erhält man genau die Y-Wrte an diesen Stützstellen." http://www.gomatlab.de/interp1-mach.....t-was-es-soll-t23022.html
Das hat dem Betroffenem geholfen, mir aber leider nicht. Was meinst du damit?

Ich habe die Verwendung von interp auf zwei verschiedenen Wegen gefunden:
1.)
Code:
winkel_daten = interp1(1:500, winkel, linspace(1, 500), 'spline');
 

2.)
Code:
daten = interp1(winkel, moment, 1:500);
 

(so hätte ich die Vorschläge auf mein Problem angewendet, Nr.1 kommt aus dem zitierten Beitrag von Jan S, und Nr.2 von der Matlab Hilfe)

Jetzt ist interp 1-D, da stell ich mir die Frage wie sich das auswirkt. Wenn 1.) richtig ist, müsste ich dann meine zugehörigen Moment-Daten ähnlich verändern ?
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: 26.04.2016, 19:06     Titel:
  Antworten mit Zitat      
Hallo Pabrelin,

Die beiden Code-Zeilen berechnen ganz unterschiedliche Dinge.
Bitte erkläre noch, auf welche Weise Du die Längen der Vektoren aneinander anpassen möchtest.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 26.04.2016, 19:43     Titel:
  Antworten mit Zitat      
Bei einer Schleife habe ich ca 300 Zeilen mit Moment und Winkel (also zwei Spalten Vektoren mit ca 300 Werten, die beide bei Null starten und gegen einen Endwert verlaufen), die in Abhängigkeit ergeben eine Kurve. Ich habe mir das jetzt so vorgestellt, dass ich die gleiche Kurve aber mit 500 Punkten herausbekomme. Wenn es leichter wäre die auf 250 zu drosseln, so wäre das auch denkbar.

Also in anderen Worten, stelle ich mir vor, dass ich Start- und Endpunkt beibehalte, nur den Weg dahin in unterschiedlichen Abständen bestreite, ums mal maximal unwissenschaftlich auszudrücken Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Pabrelin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 27.04.2016, 10:26     Titel:
  Antworten mit Zitat      
Mir scheint das Problem mit interp1 (wie ich es in oben verwenden wollte) ist, dass ich die Abstände auf der x-Achse bestimmen muss, also würde mit 1:250 der Winkel 1 bis 250 in einser Schritten berechnet oder?
Ich möchte aber, dass die Abstände zwischen den Messpunkten variiert, da der Abstand zwischen Start- und Endpunkt variiert. Also Ziel soll sein in beispielsweise 250 Schritten von Winkel 0 bis Winkel max zu gelangen, unabhängig von dem maximalen Wert des Winkels.

bzw. Sorry, dass ich den Beitrag im falschen Thread geöffnet habe. Das fällt mir jetzt erst auf.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 27.04.2016, 10:32     Titel:
  Antworten mit Zitat      
linspace könnte da helfen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Pabrelin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 27.04.2016, 10:48     Titel:
  Antworten mit Zitat      
guter Tip, danke.

linspace funktioniert doch linear oder?
Ich dachte erst, ich könnte ja linspace für Winkel und Moment nutzen, aber der Zusammenhang ist nicht linear (vermutlich 3. Ordnung). Wenn ich linspace also für den Winkel nutze, muss ich noch das passende Drehmoment dazu berechnen.
Jetzt kommt dann interp1 ins spiel oder, aber da komm ich nicht weiter.

Ich komme nicht drauf, wie ich die Befehle kombiniere. Kann mir vielleicht jemand den Befehl erläutern den ich oben schon mal zitiert habe, das sieht (für mich) ja aus als ginge es in die richtige Richtung

Code:
winkel_daten = interp1(1:500, winkel, linspace(1, 500), 'spline');
Private Nachricht senden Benutzer-Profile anzeigen
 
Pabrelin
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 26.04.16
Wohnort: Wuppertal
Version: R2015b, R2016a
     Beitrag Verfasst am: 28.04.2016, 11:34     Titel:
  Antworten mit Zitat      
Ich bin hier irgendwie auf Abwege geraten und hab mich festgefahren mit dem Wunsch in Vektoren auf die gleiche Zeilenanzahl zu stutzen.
Mein ursprünglicher wunsch war aber ja, die Vektoren in eine Datei zu speichern.
Nun will ich also einen 3-D cell array definieren, in dem in in jeder schleife 2 spaltenvektoren dazu addiere.
Da ich die Länge der Spalten vor der Schleife nicht kenne, setze ich die Anzahl zu 350, um sicher zu gehen.

Code:

Daten = cell(350, 2, c-1);  

for e= 1 : c-1    % c-1 ist bei meiner Messdatei 25, aber will es allgemein halten

% Hier ist ein langer Abschnitt wo ich Minima, Maxima und Nullstellen herausarbeite
% Die Anzahl an Messwerten zwischen Null und Max ist l-1  (klein L)
% (wegen der Schleife wurde im letzten Schritt l = l +1 addiert, sodass  es l-1 Werte gibt)

phi =[]  % phi ist ein ca 250-300 Zeilen langer Spaltenvektor mit Werten von 0 bis 23
T = [] % phi ist ein ca 250-300 Zeilen langer Spaltenvektor mit Werten von 0 bis 750

% Jetzt die vorgeschlagene Speicherung und Formatierung
Daten (:, 1, e) = phi;
Daten (:, 2, e) = T;
end
Daten = reshape(Daten, 350, 2*(c-1));
 


nun erscheint die Fehlermeldung
Zitat:
Conversion to cell from double is not possible.


Die Cell-Matrix habe ich doch zu beginn mit leeren Stellen besetzt ("[]") oder? und nun will ich diese mit Zahlen füllen. Ich nehm an, dass ich den Sinn von Cell nicht verstehe, bzw was dahinter steckt.
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: 28.04.2016, 13:18     Titel:
  Antworten mit Zitat      
Hallo Pabrelin,

Cells werden nicht mit ( und ) indiziert, sondern mit den geschweiften Klammern { und }:
Code:
Daten{1, e} = phi;
Daten{2, e} = T;

Zitat:
Die Cell-Matrix habe ich doch zu beginn mit leeren Stellen besetzt ("[]") oder?

Ja.

Ein Numerisches Array enthält skalare Elemente. Ein Cell-Array kann auch Arrays als Elemente enthalten, z.B. auch andere Cell-Arrays, Structs, oder numerische Arrays verschiedener Größe. Letzteres benötigst Du: Da die Vektoren unterschiedliche Größe haben, passen sie nicht in ein numerisches 3D-Array, aber in ein 2D-Cell-Array.

Dies ist unter "doc cell" nochmal ausführlich beschrieben.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.