Verfasst am: 14.10.2015, 11:10
Titel: alle Variablen Input, alle Variablen output
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:
Verfasst am: 14.10.2015, 11:16
Titel: Re: alle Variablen Input, alle Variablen output
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.
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
_________________
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?!
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.
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
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'});
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.
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!
wenn du Code nicht verstehst, dann bitte in die Dokumentation der entsprechenden Funktionen schauen.
Wenn du dann etwas weiterhin nicht verstehst, bitte konkret nachfragen.
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.
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
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.