Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

MATLAB, Simulink, Stateflow

Fachkräfte:
weitere Angebote

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Alle Elemente einer Zelle mit Wert eines Vektors addieren

 

AliKoptar
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 19.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2021, 16:09     Titel: Alle Elemente einer Zelle mit Wert eines Vektors addieren
  Antworten mit Zitat      
Hallo liebe Matlab-Profis,

mein Problem ist folgendes: Ich habe einen großen Vektor in mehrere Abschnitte unterteilt und diese Abschnitte mit mat2cell in unterschiedliche Zellen gepackt. Jetzt möchte ich alle Werte in einer Zelle mit einer bestimmten Zahl addieren. Die jeweiligen Summanden sind in einem Vektor hinterlegt, der so viele Zeilen hat, wie es Zellen gibt.
Also beispielsweise habe ich 3 Zellen und dazu einen Vektor mit 3 Zeilen und alle Elemente der ersten Zelle sollen mit der Zahl aus der ersten Zeile des Vektors addiert werden, die zweite Zelle mit der 2. Zahl des Vektors, ...

Über jede Hilfe bin ich sehr dankbar.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 23.520
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.10.2021, 16:27     Titel:
  Antworten mit Zitat      
Hallo,

ich würde es mit einer for-Schleife oder mit cellfun versuchen.
Solltest du schon etwas versucht haben, bitte die bisherigen Versuche posten und welche Probleme dabei aufgetreten sind.
Wenn du Beispieldaten als .mat-Datei anhängen kannst, ist das auch immer klarer als eine Beschreibung. Vor allem kann man anhand der Beispieldaten eventuelle Vorschläge direkt ausprobieren.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
AliKoptar
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 19.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.10.2021, 17:32     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Antwort. Dass etwas Code hilfreich sein kann, dachte ich mir fast. Allerdings wollte ich damit nicht unnötig verwirren. Ich versuche es dennoch:
Das Ziel ist es, phi_kappa_2 zu zerschneiden und neu zusammenzusetzen.

Code:

phi_kappa_2=[0.301764;   0.581219;   0.783228;   0.958906;   1.121313;   1.275984;
 1.425768;   1.572285;   1.716506;   1.859027;   2.000212;   2.140276;   2.279341;
 2.417459;   2.554644;   2.690882;   2.826140;   2.960378;   3.093550;  -3.057577;
 -2.926677;  -2.796977;  -2.668516;  -2.541327;  -2.415437;  -2.290871;  -2.167644;
 -2.045770;  -1.925256;  -1.806105;  -1.688317;  -1.571887;  -1.456806;  -1.343065;
 -1.230648;  -1.119539;  -1.009721;  -0.901174;  -0.793875;  -0.687803;  -0.582933;
 -0.479242;  -0.376703;  -0.275292;  -0.174982;  -0.075748;   0.022438;   0.119600;
   0.215764;   0.310957;   0.405205;   0.498531;   0.590961;   0.682519;   0.773229;
   0.863114;   0.952198;   1.040503;   1.128050;   1.214861;   1.300957;   1.386357;
   1.471082;   1.555152;   1.638583;   1.721395;   1.803605;   1.885231;   1.966289;
   2.046794;   2.126763;   2.206211;   2.285153;   2.363603;   2.441574;   2.519081;
   2.596136;   2.672752;   2.748941;   2.824715;   2.900086;   2.975064;   3.049660;
   3.123886;  -3.085435;  -3.011922;  -2.938751;  -2.865912;  -2.793396;  -2.721195;
   -2.649300;  -2.577703;  -2.506396;  -2.435371;  -2.364621;  -2.294138;  -2.223916;
   -2.153947;  -2.084224;  -2.014742;  -1.945494;  -1.876474;  -1.807675;  -1.739092;
  -1.670720;  -1.602552;  -1.534583;  -1.466809;  -1.399223;  -1.331822;  -1.264599;
  -1.197552;  -1.130674;  -1.063961;  -0.997410;  -0.931016;  -0.864774;  -0.798680;
  -0.732732;  -0.666924;  -0.601253;  -0.535715;  -0.470307;  -0.405026;  -0.339867;
  -0.274827];


%%%%%%%% Peaks finden als Vorzeichenwechsel von + nach - in der Ableitung
          D = [0; diff(phi_kappa_2)];;
          d_pos = D>0;
          d_neg = D<0;
          pos_pks = d_pos(1:end-1) & d_neg(2:end);  % =1 wenn Maximum
          x_pks=find(pos_pks);                      % an welchen Stellen sind die Maxima
          n_x_pks=numel(x_pks);                     % Anzahl der Maxima
          l_cut=numel(phi_kappa_2)-x_pks(end);      % Länge des letzten Abschnitts
          l_cuts=[diff([0;x_pks]); l_cut];          % Länge aller Abschnitte
         
%%%%%%%%  Funktion phi_kappa_2 an den Maxima zu zerschneiden
          phi_kappa_2_cut=mat2cell(phi_kappa_2, l_cuts);    % Liefert 3x1 Matrix mit den Abschnitten
         
%%%%%%%%  Punkte (Y-Werte der Maxima) bestimmen, an denen wieder zusammensgesetzt werden soll          
          y_join=[0; phi_kappa_2(x_pks)];   % Zur Verschiebung hin zum Endpunkt des vorherigen Abschnitt
         
         
         % erster Teil und 2. Teil der neuen Funktion
          p_12 = [phi_kappa_2_cut{1}; phi_kappa_2_cut{2}+y_join(2)+abs(phi_kappa_2_cut{2}(1))];
         %  dritter Teil
          p_3 = phi_kappa_2_cut{3}+p_12(end)+abs(phi_kappa_2_cut{3}(1));
         %  zusammensgesetzt
          p_123= [p_12; p_3];
 


Diese Lösung funktioniert (das neu-Zusammensetzen von phi_kappa_2), ist aber nicht auf andere Probleme übertragbar. Wenn beispielsweise in 2 oder 4 oder 5 Abschnitte unterteilt werden soll.
Deshalb die Frage, ob ich meine Zellen (in denen die Kurvenabschnitte drin stecken) mit einem Verschiebungsvektor addieren kann (teilweise angedeutet mit y_join)

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 23.520
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.10.2021, 20:57     Titel:
  Antworten mit Zitat      
Hallo,

Soll p_123 das "neu zusammengesetzte phi_kappa_2" sein? Dann sollte das auch aus dem Variablennamen hervorgehen.
Auch ist mir das Muster, nach dem die einzelnen Teile gebildet werden sollen, nicht klar. Einmal kommt y_join(2) vor, einmal p_12(end). Der erste Teil scheint auch gar nicht dem Muster der folgenden zu folgen?
Schreib doch mal p_1 bis p_3 und eventuell noch ein p_4 so hin, dass das Muster klar wird. Ich würde stattdessen übrigens ein Cell Array verwenden, dann kannst du das mit
vertcat(p{:}) leicht zusammenfügen.

Zitat:
Deshalb die Frage, ob ich meine Zellen (in denen die Kurvenabschnitte drin stecken) mit einem Verschiebungsvektor addieren kann (teilweise angedeutet mit y_join)

Die Antwort bleibt die gleiche: cellfun oder eine for-Schleife. Für beides muss jedoch klar sein, nach welchem Muster vorgegangen werden soll. Dieses Muster kann ich noch nicht erkennen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
AliKoptar
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 19.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2021, 10:19     Titel:
  Antworten mit Zitat      
Hallo Harald, du hast natürlich recht.
Die Benennung ist unsauber und das Schema ist nicht so gut erkennbar. Deshalb hier noch eine überarbeitete Version des Zusammensetzens, ohne den Versuch einen Verschiebungvektor y_join zu nutzen:
Code:

 phi_kappa_2=[0.301764;   0.581219;   0.783228;   0.958906;   1.121313;   1.275984;
 1.425768;   1.572285;   1.716506;   1.859027;   2.000212;   2.140276;   2.279341;
 2.417459;   2.554644;   2.690882;   2.826140;   2.960378;   3.093550;  -3.057577;
 -2.926677;  -2.796977;  -2.668516;  -2.541327;  -2.415437;  -2.290871;  -2.167644;
 -2.045770;  -1.925256;  -1.806105;  -1.688317;  -1.571887;  -1.456806;  -1.343065;
 -1.230648;  -1.119539;  -1.009721;  -0.901174;  -0.793875;  -0.687803;  -0.582933;
 -0.479242;  -0.376703;  -0.275292;  -0.174982;  -0.075748;   0.022438;   0.119600;
   0.215764;   0.310957;   0.405205;   0.498531;   0.590961;   0.682519;   0.773229;
   0.863114;   0.952198;   1.040503;   1.128050;   1.214861;   1.300957;   1.386357;
   1.471082;   1.555152;   1.638583;   1.721395;   1.803605;   1.885231;   1.966289;
   2.046794;   2.126763;   2.206211;   2.285153;   2.363603;   2.441574;   2.519081;
   2.596136;   2.672752;   2.748941;   2.824715;   2.900086;   2.975064;   3.049660;
   3.123886;  -3.085435;  -3.011922;  -2.938751;  -2.865912;  -2.793396;  -2.721195;
   -2.649300;  -2.577703;  -2.506396;  -2.435371;  -2.364621;  -2.294138;  -2.223916;
   -2.153947;  -2.084224;  -2.014742;  -1.945494;  -1.876474;  -1.807675;  -1.739092;
  -1.670720;  -1.602552;  -1.534583;  -1.466809;  -1.399223;  -1.331822;  -1.264599;
  -1.197552;  -1.130674;  -1.063961;  -0.997410;  -0.931016;  -0.864774;  -0.798680;
  -0.732732;  -0.666924;  -0.601253;  -0.535715;  -0.470307;  -0.405026;  -0.339867;
  -0.274827];

%%%%%%%% Peaks finden als Vorzeichenwechsel von + nach - in der Ableitung
          D = [0; diff(phi_kappa_2)];
          d_pos = D>0;
          d_neg = D<0;
          pos_pks = d_pos(1:end-1) & d_neg(2:end);  % =1 wenn Maximum
          x_pks=find(pos_pks);                      % an welchen Stellen sind die Maxima
          n_x_pks=numel(x_pks);                     % Anzahl der Maxima
          l_cut=numel(phi_kappa_2)-x_pks(end);      % Länge des letzten Abschnitts
          l_cuts=[diff([0;x_pks]); l_cut];          % Länge aller Abschnitte
         
%%%%%%%%  Funktion phi_kappa_2 an den Maxima zu zerschneiden
          phi_kappa_2_cut=mat2cell(phi_kappa_2, l_cuts);    % Liefert 3x1 Matrix mit den Abschnitten

%%%%%%%%  Verschiebung der einzelnen Abschnitte in y-Richtung:
%%%%%%%%    - Verschiebung zu Endpunkten des jeweils vorherigen Abschnitts
%%%%%%%%    - jeder Abschnitt soll bei y=0 starten, deshalb +abs(jeweils erster Wert)
         
         %  erster Teil der neuen Funktion
          phi_kappa_2_new_1= phi_kappa_2_cut{1};
         %  zweiter Teil der neuen Funktion
          phi_kappa_2_new_2 = phi_kappa_2_cut{2}+phi_kappa_2_new_1(end)+abs(phi_kappa_2_cut{2}(1));
         %  dritter Teil:
          phi_kappa_2_new_3 = phi_kappa_2_cut{3}+phi_kappa_2_new_2(end)+abs(phi_kappa_2_cut{3}(1));
         %  falls es einen vierten Teil geben würde:
         %  phi_kappa_2_new_4 = phi_kappa_2_cut{4}+phi_kappa_2_new_3(end)+abs(phi_kappa_2_cut{4}(1));
         
         %  zusammensgesetzt:
          phi_kappa_2_new= [phi_kappa_2_new_1; phi_kappa_2_new_2;phi_kappa_2_new_3]
 

Das Muster ist hoffentlich nun besser erkennbar.

Das Problem hierbei: es ist nicht universell anwendbar, sondern muss immer angepasst werden, je nachdem wie viele Abschnitte zustande kommen. Deshalb wäre mir etwas 'automatisches' lieber, wie zum Beispiel ein Array (y_join) das ich automatisch auf die Inhalte der einzelnen Zellen aufaddieren kann.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 23.520
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.10.2021, 11:11     Titel:
  Antworten mit Zitat      
Hallo,

das verstehe ich deutlich besser. Ich würde es so angehen:

Code:
phi_kappa_2_new = cell(size(phi_kappa_2_cut));
phi_kappa_2_new{1} = phi_kappa_2_cut{1};
for k = 2:length(phi_kappa_2_new)
    phi_kappa_2_new{k} = phi_kappa_2_cut{k}+phi_kappa_2_new{k-1}(end)+abs(phi_kappa_2_cut{k}(1));
end
phi_kappa_2_new = cell2mat(phi_kappa_2_new);


Ich gehe hier davon aus, dass die Anzahl der Abschnitte die Anzahl der Elemente von phi_kappa_2_cut ist. Falls nicht, muss man das noch anpassen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
AliKoptar
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 19.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2021, 12:07     Titel:
  Antworten mit Zitat      
Vielen Dank. Das funktioniert wunderbar, auch wenn jetzt die Überschrift nicht mehr so richtig dazu passt Wink
Hast du eventuell noch eine gute Idee, wie ich die kleinen Stufen aus meiner Kurve herausbekomme? Also dass beispielsweise der erste Punkt von Abschnitt 2 den letzten Punkt von Abschnitt 1 überschreibt. Die Gesamtlänge des Arrays wird damit zwar kleiner, aber es würde mit dennoch sehr helfen eine glatte Kurve zu bekommen.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 23.520
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.10.2021, 13:23     Titel:
  Antworten mit Zitat      
Hallo,

z.B.
Code:
phi_kappa_2_new(abs(diff(phi_kappa_2_new)) < 1e-6) = [];

Alternativ bereits beim Erstellen der Teilstücke je nachdem das letzte oder erste Element (wenn sie gleich bzw. sehr nah beieinander sind, ist das ja egal) entfernen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
AliKoptar
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 19.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2021, 16:44     Titel:
  Antworten mit Zitat      
vielen Dank
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2021 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.