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

Skript verkürzen

 

Sören95
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 28.04.2021, 12:48     Titel: Skript verkürzen
  Antworten mit Zitat      
Moin,

ich habe ein ziemlich unübersichtliches Skript das zwar läuft, aber eben unübersichtlich ist. Ich suche schon lange eine Möglichkeit das irgendwie zu verkürzen. Vielleicht hat da jemand einen Tipp für mich.

Ich erkläre kurz was hier gemacht wird. Es werden zwei Tabellen erstellt, in der jeweils 11 Werte stehen. Diese 11 Werte stellen Mittelwerte dar und werden allesamt unter der gleichen Bedingungen aus unterschiedlichen Tabellen, also aus insgesamt 22 Tabellen, aus dem Workspace geholt.

Genau das hier muss ich noch für andere Bedingungen ausführen. Ich muss also immer wieder auf dieselbe Abfolge von Tabellen (die wie gesagt im Workspace sind) zugreifen und dann jeweils die gleiche Bedingung dafür ausführen. Weil sich die Bedingung ja immer auf eine andere Tabelle bezieht, weiß ich nicht wie ich das hier abkürzen kann und habe daher bisher ewig lange Skripte..

Ich hoffe hier steigt jemand durch und hat vielleicht eine passende Idee.


Code:




%kf_lvl2_hQ Tabelle erstellen:

kf_lvl2_hQ=[...
mean( Farge_kf_SQW.Max (Farge_kf_SQW.Hw >= MHW+250 & Farge_kf_SQW.Abfluss > hQ));
mean( Elsfl_kf_SQW.Max (Elsfl_kf_SQW.Hw >= MHW+250 & Elsfl_kf_SQW.Abfluss > hQ));
mean( Brake_kf_SQW.Max (Brake_kf_SQW.Hw >= MHW+250 & Brake_kf_SQW.Abfluss > hQ));
mean( Recht_kf_SQW.Max (Recht_kf_SQW.Hw >= MHW+250 & Recht_kf_SQW.Abfluss > hQ));
mean( Stroh_kf_SQW.Max (Stroh_kf_SQW.Hw >= MHW+250 & Stroh_kf_SQW.Abfluss > hQ));
mean( Nordenh_kf_SQW.Max (Nordenh_kf_SQW.Hw >= MHW+250 & Nordenh_kf_SQW.Abfluss > hQ));
mean( Blexen_kf_SQW.Max (Blexen_kf_SQW.Hw >= MHW+250 & Blexen_kf_SQW.Abfluss > hQ));
mean( BrAL_kf_SQW.Max (BrAL_kf_SQW.Hw >= MHW+250 & BrAL_kf_SQW.Abfluss > hQ));
mean( Robb_kf_SQW.Max (Robb_kf_SQW.Hw >= MHW+250 & Robb_kf_SQW.Abfluss > hQ));
mean( Dwars_kf_SQW.Max (Dwars_kf_SQW.Hw >= MHW+250 & Dwars_kf_SQW.Abfluss > hQ));
mean( LAW_kf_SQW.Max (LAW_kf_SQW.Hw >= MHW+250 & LAW_kf_SQW.Abfluss > hQ))];

%ke_lvl2_hQ Tabelle erstellen:

ke_lvl2_hQ=[...
mean( Farge_ke_SQW.Min (Farge_ke_SQW.Hw >= MHW+250 & Farge_ke_SQW.Abfluss > hQ));
mean( Elsfl_ke_SQW.Min (Elsfl_ke_SQW.Hw >= MHW+250 & Elsfl_ke_SQW.Abfluss > hQ));
mean( Brake_ke_SQW.Min (Brake_ke_SQW.Hw >= MHW+250 & Brake_ke_SQW.Abfluss > hQ));
mean( Recht_ke_SQW.Min (Recht_ke_SQW.Hw >= MHW+250 & Recht_ke_SQW.Abfluss > hQ));
mean( Stroh_ke_SQW.Min (Stroh_ke_SQW.Hw >= MHW+250 & Stroh_ke_SQW.Abfluss > hQ));
mean( Nordenh_ke_SQW.Min (Nordenh_ke_SQW.Hw >= MHW+250 & Nordenh_ke_SQW.Abfluss > hQ));
mean( Blexen_ke_SQW.Min (Blexen_ke_SQW.Hw >= MHW+250 & Blexen_ke_SQW.Abfluss > hQ));
mean( BrAL_ke_SQW.Min (BrAL_ke_SQW.Hw >= MHW+250 & BrAL_ke_SQW.Abfluss > hQ));
mean( Robb_ke_SQW.Min (Robb_ke_SQW.Hw >= MHW+250 & Robb_ke_SQW.Abfluss > hQ));
mean( Dwars_ke_SQW.Min (Dwars_ke_SQW.Hw >= MHW+250 & Dwars_ke_SQW.Abfluss > hQ));
mean( LAW_ke_SQW.Min (LAW_ke_SQW.Hw >= MHW+250 & LAW_ke_SQW.Abfluss > hQ))];


 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

bei separaten Variablen geht das theoretisch mit eval, ist praktisch aber unübersichtlich, fehleranfällig etc. und daher nicht empfehlenswert.

Besser wäre, die Daten nochmal in ein Cell oder Struct abzulegen. Dann kann man das je nachdem mit cellfun oder structfun elegant verarbeiten.

Für weitere Unterstützung bitte sagen, welchen der Ansätze du verfolgen willst und idealerweise ein Datenbeispiel zur Verfügung stellen.

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
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 28.04.2021, 14:40     Titel:
  Antworten mit Zitat      
Danke für deine Antwort. Nach genau so einer eleganten Lösung suche ich.


Ich habe das gerade mal mit "struct" versucht und erstmal drei der Variablen dort abgelegt. Das habe ich als Datei mal beigefügt. Wie ich nun daraus jeweils aus der .Max Spalte, mit der Bedingung aus der .Abfluss Spalte einen Mittelwert bilde, habe ich noch nicht herausgefunden.

All.mat
 Beschreibung:

Download
 Dateiname:  All.mat
 Dateigröße:  284.47 KB
 Heruntergeladen:  167 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.04.2021, 15:17     Titel:
  Antworten mit Zitat      
Hallo,

Code:
MHW = 500; % zum Testen
hQ = 100; % zum Testen
f = @(x) mean(x.Max (x.Hw >= MHW+250 & x.Abfluss > hQ)); % x ist was auch immer reinkommt
structfun(f, All, 'UniformOutput', false)


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
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 28.04.2021, 15:54     Titel:
  Antworten mit Zitat      
Wow, vielen Dank! Soweit funktioniert das und verkürzt mein Skript damit extrem. Ich kümmere mich morgen um die Umsetzung auf mein komplettes Skript und melde mich ggf. nochmals mit weiteren Fragen. Bis hierhin setze ich den Status auf "beantwortet".

Vielen Dank nochmal!
Private Nachricht senden Benutzer-Profile anzeigen
 
Sören95
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 12.01.21
Wohnort: ---
Version: R2020b
     Beitrag Verfasst am: 30.04.2021, 10:53     Titel:
  Antworten mit Zitat      
Noch eine Frage:

Es geht später weiter mit dem Plotten. Dort habe ich immer wieder genau das gleiche stehen. Kann ich das irgendwie abspeichern und dann mit einem einfachen Befehl wieder aufrufen?


Folgendes steht unter vielen Plots genau so:

Code:
set(gcf, 'Position', [100 100 1000 300],'Color','w');

ax1 = gca; % current axes                           % 2. x-Achse unten
ax1_pos = ax1.Position; % position of first axes
grid on;
xlabel('abc [km]');
ylabel('S []');

ax2 = axes('Position',ax1_pos,'XAxisLocation','top','Color','none','YTick',[]);
xlim(ax2,[20 120]);
xticks(ax2,[26.26 33.32 39.18 ]);
xticklabels(ax2,{'x','y','z'});
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.04.2021, 15:33     Titel:
  Antworten mit Zitat      
Hallo,

sieht so aus, als ob du das in eine Funktion ohne Inputs packen und diese aufrufen könntest. Die Verwendung von gcf und gca kann bei mehreren Koordinatensystemen problematisch werden. Besser ist es, wirklich die Handles auf die Koordinatensysteme (wie z.B. in deinem Code ax2) zu übergeben.

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