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

alle Variablen Input, alle Variablen output

 

Zoe401
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 88
Anmeldedatum: 07.10.15
Wohnort: Bei Stuttgart
Version: R2015a
     Beitrag Verfasst am: 14.10.2015, 11:10     Titel: alle Variablen Input, alle Variablen output
  Antworten mit Zitat      
Hallo,
ich habe ein kleines Problem. Ich habe eine Funktion die mir eine Variable "n01" (das ist eine Tabelle) nimmt, sie durch eine funktion schickt um sie zu mitteln und dann überschreibt mit den gemittelten Werten. Das funktioniert alles wunderbar.
Jetzt muss ich eine Funktion schreiben, die alle Variablen n01, n02... bis n19 durch diese funktion schickt. Ich könnte die funktion 20 mal hinschreiben, aber ich würde das gerne automatisieren
Vermutlich geht das mit einer for-Schleife, aber wie?

So sieht es ausgeschrieben aus. Funktioniert, aber das ist ja irgendwie ungeschickt, falls ich mal mehr oder weniger Variablen habe:

Code:
function [n01,n02,n03,n04,n05,n06,n07,n08,n09,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19] = neutralize_all_tables(n01,n02,n03,n04,n05,n06,n07,n08,n09,n10,n11,n12,n13,n14,n15,n16,n17,n18,n19)
[n01] = neutralize_table(n01);
[n02] = neutralize_table(n02);
[n03] = neutralize_table(n03);
[n04] = neutralize_table(n04);
[n05] = neutralize_table(n05);
[n06] = neutralize_table(n06);
[n07] = neutralize_table(n07);
[n08] = neutralize_table(n08);
[n09] = neutralize_table(n09);
[n10] = neutralize_table(n10);
[n11] = neutralize_table(n11);
[n12] = neutralize_table(n12);
[n13] = neutralize_table(n13);
[n14] = neutralize_table(n14);
[n15] = neutralize_table(n15);
[n16] = neutralize_table(n16);
[n17] = neutralize_table(n17);
[n18] = neutralize_table(n18);
[n19] = neutralize_table(n19);


Liebe Grüße,
Zoe
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: 14.10.2015, 11:16     Titel: Re: alle Variablen Input, alle Variablen output
  Antworten mit Zitat      
Hallo Zoe401,

Das ist eines der Probleme, mit den Anfänger am häufigsten kämpfen. Suche mal im Internet nach "Matlab FAQ" und Du wirst noch mehr Probleme sehen, die Du vermeiden kannst, weil andere schon damit gekämpft haben.

Die Lösung ist es, erst gar keinen Index im Namen der Variablen zu verstecken. Verwende stattdessen entweder ein Array (falls die Variablen alle den gleichen Typ und die gleiche Größe haben), oder ein Cell andernfalls:
Code:
n = cell(1, 20);
for k = 1:20
  n{k} = neutralize_all_tables(n{k});
end

Dann ist der Code sofort unabhängig davon, wie viele Variablen Du hast. Auch eine Million ist dann kein Problem! Zudem ist die Gefahr eines Tippfehlers viel kleiner.

Verwende immer einen Index als Index, keinen Spezial-Namen.

Gruß, Jan
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: 14.10.2015, 11:17     Titel:
  Antworten mit Zitat      
es wäre sehr einfach wenn du den index nicht im namen versteckt hättest.
jetzt musst du dir warscheinlich etwas hässliches mit eval basteln
grüße
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Zoe401
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 88
Anmeldedatum: 07.10.15
Wohnort: Bei Stuttgart
Version: R2015a
     Beitrag Verfasst am: 14.10.2015, 13:21     Titel:
  Antworten mit Zitat      
Wo soll ich den Indizes sonst verstecken, wenn nicht im Namen, ich muss ja die Variablen auseinander halten?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

genau so, wie von Jan vorgeschlagen: Statt vieler durchnumerierter Variablen eine Variable, in der alles enthalten ist.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Zoe401
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 88
Anmeldedatum: 07.10.15
Wohnort: Bei Stuttgart
Version: R2015a
     Beitrag Verfasst am: 14.10.2015, 13:53     Titel:
  Antworten mit Zitat      
Ja nur dann kann ich den Überblick nicht mehr behalten.
Wenn ich n01, n02, n03....n20 habe und sie als Array zusammenfasse in "n". Dann wird aus meinem n01 plötzlich n{1,1} und ich kann es nicht mehr als n01 aufrufen oder finden! Und wenn ich dann eben ewig viele nxxx habe komme ich da durcheinander, oder gibt es eine möglichkeit, die arrays zu benennen, das ich es nicht als n{1,1} aufrufen muss sondern als n01?

und wenn ich die jetzt in einem array habe, ist das Problem vom Anfang ja auch noch nicht gelöst?!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 14.10.2015, 14:02     Titel:
  Antworten mit Zitat      
Hallo,

wo ist der Unterschied, ob du n{1} oder n01 schreibst?

Zitat:
Und wenn ich dann eben ewig viele nxxx habe komme ich da durcheinander

Wenn du dann neben denn nxxx auch noch kxxx und hxxx hast, oder vielleicht noch mx_y_z, dann wird das deutlich unübersichtlicher als unser Vorschlag.

Zitat:
und wenn ich die jetzt in einem array habe, ist das Problem vom Anfang ja auch noch nicht gelöst?!

Doch, da sich die ganze Funktion auf Jans wenige Zeilen zusammenfassen lässt.

Code:
function n = neutralize_all_tables(n)

for k = 1:numel(n)
  n{k} = neutralize_table(n{k});
end


Grüße,
Harald
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: 14.10.2015, 14:10     Titel:
  Antworten mit Zitat      
Hallo Zoe401,

Zitat:
Dann wird aus meinem n01 plötzlich n{1,1} und ich kann es nicht mehr als n01 aufrufen oder finden!

Genau! Das ist ja der Sinn der Sache. Der Zugriff auf "n01" kann nicht sinnvoll im Code dynamisch geregelt werden. Man kann so etwas nicht in einer Schleife abarbeiten lassen. Es ist deshalb massiv viel sinnvoller, einen Index zu verwenden, die Daten also n{1,1} zu nennen.
Wenn Du n100293826452 hast, wirst Du ganz sicherlich auch verwirrt sein, und debuggen lässt sich das garantiert nicht mehr.

Ich frage noch mal, ob Du verstanden hast, dass dies ein typischen Anfänger-Problem ist und man erst eine gewisse Hürde überwinmden muss, bevor man erkennt, wie einfach man sich das Programmieren mit Indices macht. Das Thema diskutieren wir hier fast täglich seit vielen Jahren. Probiere es einfach mal aus.

Zitat:
und wenn ich die jetzt in einem array habe, ist das Problem vom Anfang ja auch noch nicht gelöst?!

Doch. Dann kannst Du es nämlich einfach in eienr Schleife laufen lassen, wie ich es schon als Code gepostet hatte.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 88
Anmeldedatum: 07.10.15
Wohnort: Bei Stuttgart
Version: R2015a
     Beitrag Verfasst am: 14.10.2015, 14:44     Titel:
  Antworten mit Zitat      
Okay der Code sieht logisch aus ("numel" kannte ich noch nicht danke!)

Aber jetzt muss ich ja noch meine funktion neutralize_all_tables ändern

Ihr schlagt bestimmt die Hände über dem Kopf zusammen Embarassed
Aber so hatte ich das gelöst wenn ich eine Tabelle(n01) mitteln wollte:
B war dabei immer der Spaltenname der Tabelle


Code:
function [n01] = neutralize_table(n01)
% Um die Signale besser vergleichen zu können werden die Werte gemittelt.
% Mittelwerte aller B werden berechnet
mB1 = mean(n01{:,'B1'});
mB2 = mean(n01{:,'B2'});
mB3 = mean(n01{:,'B3'});
mB4 = mean(n01{:,'B4'});
mB5 = mean(n01{:,'B5'});
mB6 = mean(n01{:,'B6'});
mB7 = mean(n01{:,'B7'});
mB9 = mean(n01{:,'B9'});
mB10 = mean(n01{:,'B10'});
mB11 = mean(n01{:,'B11'});
mB12 = mean(n01{:,'B12'});
mB15 = mean(n01{:,'B15'});
mB17 = mean(n01{:,'B17'});
mB18 = mean(n01{:,'B18'});
mB19 = mean(n01{:,'B19'});
mB20 = mean(n01{:,'B20'});

mn1 = {mB1,mB2,mB3,mB4,mB5,mB6,mB7,mB9,mB10,mB11,mB12,mB15,mB17,mB18,mB19,mB20};

%  Mittelwerte werden von den tatsächlichen Werten abgezogen
B1 = n01{:,'B1'}-mn1{:,1};
B2 = n01{:,'B2'}-mn1{:,2};
B3 = n01{:,'B3'}-mn1{:,3};
B4 = n01{:,'B4'}-mn1{:,4};
B5 = n01{:,'B5'}-mn1{:,5};
B6 = n01{:,'B6'}-mn1{:,6};
B7 = n01{:,'B7'}-mn1{:,7};
B9 = n01{:,'B9'}-mn1{:,8};
B10 = n01{:,'B10'}-mn1{:,9};
B11 = n01{:,'B11'}-mn1{:,10};
B12 = n01{:,'B12'}-mn1{:,11};
B15 = n01{:,'B15'}-mn1{:,12};
B17 = n01{:,'B17'}-mn1{:,13};
B18 = n01{:,'B18'}-mn1{:,14};
B19 = n01{:,'B19'}-mn1{:,15};
B20 = n01{:,'B20'}-mn1{:,16};

%Die tatsächlichen Werte werden in einem Array zusammengeschrieben
n01 = table(B1,B2,B3,B4,B5,B6,B7,B9,B10,B11,B12,B15,B17,B18,B19,B20);


Aber es hatte funktioniert Smile

Und ja kann ich mir vorstellen, das ihr das täglich diskutieren dürft. Aber es ist schon ein bisschen komisch dieses Umdenken. Es wird langsam klarer aber ich denke durchschaut habe ich es noch nicht ganz. Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

mit anderen Worten, du willst von jeder Spalte den Mittelwert abziehen?
Das kannst du auch so erledigen:

Code:
T = table((1:10)',((1:10)'.^2),((1:10)'.^3),'VariableNames', {'B1', 'B2', 'B3'}); % Beispieldaten
f = @(x) x - mean(x);
names = T.Properties.VariableNames;
T = varfun(f, T);
T.Properties.VariableNames = names;


Das schöne: dies ist völlig unabhängig davon, wie die Spalten heißen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Zoe401
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 88
Anmeldedatum: 07.10.15
Wohnort: Bei Stuttgart
Version: R2015a
     Beitrag Verfasst am: 14.10.2015, 15:03     Titel:
  Antworten mit Zitat      
genau von jeder Spalte soll der Mittelwert berechnet werden und von jedem Wert in der Spalte abgezogen, damit ich einen gemittelten Graphen am Schluss habe und alle Werte um 0 pendeln -> besser zum vergleichen.

Ich verstehe den Code nicht ganz sory, ich kenne viele Matlab funktionen noch nicht!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn du Code nicht verstehst, dann bitte in die Dokumentation der entsprechenden Funktionen schauen.
Wenn du dann etwas weiterhin nicht verstehst, bitte konkret nachfragen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Zoe401
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 88
Anmeldedatum: 07.10.15
Wohnort: Bei Stuttgart
Version: R2015a
     Beitrag Verfasst am: 14.10.2015, 15:46     Titel:
  Antworten mit Zitat      
Juhu jetzt hat es geklappt!
Dankeschön für die Idee mit dem Array.

Hab jetzt meine Funktion so umgeschrieben bekommen das es mit dem Code

Code:
function n = neutralize_all_tables(n)

for k = 1:numel(n)
  n{k} = neutralize_table(n{k});
end


funktioniert hat.

Vielen Dank! Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

das ist ja das eine. Das andere ist aber, dass du dir mit meinem Vorschlag das Auseinandernehmen und Wiederzusammenfügen des Tables sparen kannst.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Zoe401
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 88
Anmeldedatum: 07.10.15
Wohnort: Bei Stuttgart
Version: R2015a
     Beitrag Verfasst am: 14.10.2015, 16:01     Titel:
  Antworten mit Zitat      
Ja aber ich verstehe einfach die Bezeichnungen nicht!

(1:10)',((1:10)'.^2),((1:10)'.^3)

@(x) x

T.Properties.VariableNames = names;

das sind Sachen die ich in den doc-files nicht gefunden habe. Wozu benutze ich ein @-Zeichen, wozu ^3 und was ist .Properties.VariableNames?

Dazu habe ich nichts gefunden!

Ich weiss, dass ich teilweise Schrott mache und man das alles kürzer und schneller machen könnte. Aber dazu kenne ich mich zu wenig aus und auch niemand der es mir so bis in die Tiefe hinein erklären kann!

Bin grad nur froh und dankbar das es funktioniert hat.
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 - 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.