Hallo Community, ich habe gerade ein Problem mit Matlab. Gegeben ist eine Liste mit Dezimalzahlen im Floatingpoint Format. Sie umfasst 400 Elemente. Es sind eigentlich Funktionswerte, von denen ich jetzt den Mittelwert berechnen möchte. Dabei ist es wichtig, dass NICHT der Mittelwert gebildet wird durch Aufaddieren der Punkte und Teilen durch die Anzahl! Ich möchte die Punkte gerne als Funktion Interpolieren (linear!) und davon dann den Mittelwert berechnen. Der dürfte sich ja von dem auf Basis der Punkte unterscheiden. Die Berechnung mit "mean" funktioniert ja ganz gut, aber ich befürchte, der addiert und teilt danach... man kann doch in Matlab auch Funktionen definieren, ableiten, integrieren usw. Da gibt's doch sicherlich auch eine Funktion, sodass ich von meiner mithilfe von "interp1()" erstellte Funktion den Mittelwert bilden kann! Ich habe bereits Google betätigt, werde aber nicht fündig. Mean bezieht sich offensichtlich nur auf einzelne Punkte in Arrays/Vektoren. Kennt jemand eine (vernünftige) Dokumentation von Matlab oder kann mir direkt helfen? Die Matlab-Hilfe ist schlichtweg nicht zu gebrauchen... arbeite normalerweise mit Python, da bin ich gute Dokumentationen gewohnt. Vielen Dank im Voraus! kludwig
Hallo, also wenn ich dich richtig verstanden habe liegen deine Daten folgendermaßen vor: [ 0 3 6 9 12 15 .... ] und du möchtest jetzt einen Mittelwert (oder vlt. den Median?). Wie liegen denn deine Werte vor? Sind diese äquidistant? Hier kannst du mal nachschauen welchen Mittelwert du eigentlich suchst. https://de.wikipedia.org/wiki/Mittelwert#Weitere_Mittelwerte_und_.C3.A4hnliche_Funktionen Auf Grundlage der von dir gegebenen Informationen kann ich leider nicht mehr tun. Hier vlt. mal noch ein Link zu einem Matlab - Forum. http://www.gomatlab.de/ Ich persönich finde die Doku von Matlab übrigens sehr gut. Gruß BT
Ludwig K. schrieb: > Dabei ist es wichtig, dass NICHT > der Mittelwert gebildet wird durch Aufaddieren der Punkte und Teilen > durch die Anzahl! Das ist aber die Definition eines Mittelwerts Ludwig K. schrieb: > Ich möchte die Punkte gerne als Funktion Interpolieren > (linear!) und davon dann den Mittelwert berechnen. Häääh? Ludwig K. schrieb: > Die Berechnung mit "mean" funktioniert ja ganz gut, aber ich befürchte, > der addiert und teilt danach... mean macht genau das wie es in der Doku spezifiziert ist. Aus einem Array von Werten den Mittelwert berechnen. Was willst du erreichen? Irgendwie beschreibst du dein Problem deutlich schlechter als die Doku matlab.
Zunächst mal: Ja, "mean" bildet, wie du richtig annimmst, die Summe über alle Elemente eines Vektors und teilt anschließend durch die Anzahl der Elemente. "interp1" ermittelt anhand der gegebenen x- und y-Werte aus neuen X-Werten zugehörige Y-Werte: Y = interp1(x, y, X) Optional kann auch noch eine Methode angegeben werden, die MathWorks-Homepage weiß da mehr. Wenn du eine Funktionsgleichung ermitteln willst, könnte dir z.B. "polyfit" helfen. Du übergibst der Funktion x- und y-Werte sowie den gewünschten Grad n des Polynoms und bekommst eine Matrix mit n+1 Elementen, den Koeffizienten vor den einzelnen Potenzen von x, zurück. Es gibt auch noch weitere Fitting-Optionen, bei denen man eine bestimmte Funktionsgleichung mit Parametern vorgeben kann, die dann an die vorliegenden Daten angepasst werden, z.B. mittels der Funktion "lsqcurvefit".
Ludwig K. schrieb: > Die Matlab-Hilfe ist schlichtweg nicht zu gebrauchen... naja.... ich finde sie sehr gut ich versteh nicht wieso du nicht aufaddieren und teilen willst? so ist der mittelwert schlichtweg definiert. wenn du eine lineare regression durchführst bekommst du einen fehler (siehe least square error). beim interpolieren lügst du immer was hinzu, und zwar das wissen, wie die messdaten grundsätzlich verteilt sind. woher weisst du überhaupt, dass du linear interpolieren musst? fachlich gesehen finde ich das vorhaben, gelinde gesagt, quatsch. hier dennoch die befehle dazu:
1 | x_org = linspace(0,1,5); |
2 | y_org = [1 4 5 6 9]; |
3 | x_interp = linspace(0,1,1000); |
4 | y_interp = interp1(x_org,y_org,x_interp); |
5 | plot(x_interp,y_interp,'k');hold on;plot(x_org,y_org,'rx','MarkerSize',10); |
6 | mean(y_interp) |
7 | mean(y_org) |
wenn mein gefühl richtig ist, sind die ergebnisse eh gleich.
Frank Meier schrieb: > wenn mein gefühl richtig ist, sind die ergebnisse eh gleich. Die sind gleich... Punkte (1, 0), (4, 1), Mittelwert (4+1)/2 = 2.5. Wird jetzt linear interpoliert so das die Punkte exakt erreicht werden, also m = (4 - 1) / (1 - 0) = 3, offset = 1 und der Mittelwert der Funktion mit
berechnet würde...
Arc Net schrieb: > Punkte (1, 0), (4, 1), Mittelwert (4+1)/2 = 2.5. Wird jetzt linear > interpoliert Er hat aber n Punkte. Will er jetzt abschnittsweise linear interpolieren, oder über ein Polynom, oder über Splines ??? Ich habe zumindest nicht verstanden was er jetzt will.
das was du eigentlich suchst so weit ich das verstehe, ist eine funktion oder einen rechenweg wie man eine funktion approximiert... ich denke du hast dich nur etwas schräg ausgedrückt mit deinem mittelwert... such mal nach der methode der kleinsten fehlerquadrate (least mean squareroot oder so auf englisch), die lässt sich sehr gut mit matlab durchführen. dann verläuft deine funktionskurve auch im mittel durch deine funktionswerte...
Hi also danke erst mal für die Antworten. Noch mal genauer: Die Funktionswerte werden, um die Schwankungen einer Versorgungsspannung zu modellieren in ein Textdokument gespeichert und nachher in Cadence importiert. Cadence simuliert und berechnet mir dann Delays vom Low-High Pegel am Eingang einer Digitalen Schaltung zum Ausgang der Schaltung, die natürlich in Abhängigkeit von der Versorgungsspannung kleiner oder größer ausfallen, da z.B. Gatekapazitäten erst geladen werden, bevor ein Transistor umschaltet. Jetzt möchte ich eine Grafik erstellen, die mir mit den Delays, die ich erhalten habe gegen die averages aufträgt. Cadence bekommt zwar nur eine Liste mit ein paar Punkten, verbindet aber selber die einzelnen Punkte mit Geraden und benutzt dann diese Zeitfunktion als Versorgungsspannungsverlauf für die Simulation. Die Grafik, die ich derzeit erhalte kann nicht korrekt sein und ich vermute deshalb, dass meine Berechnung des "average" nicht stimmt. Bis jetzt rechne ich wie gesagt die Funktionswerte zusammen und teile dann durch die Anzahl. Das würde dann aber übereinstimmen mit einem Spannungsverlauf der immer eine Zeit lang seinen Wert hält und dann auf den nächsten Wert springt. Und das ist ja nicht die Annahme, nach der die Delays berechnet wurden. Ja, da habe ich mich wohl etwas schwammig ausgedrückt. Ich suche eigentlich eher nach einer Funktion in Matlab, mit der ich erst integriere und dann durch die Zeitdauer teile- also einem Mittelwert für eine stetige Funktion, genau so wie Arc Net es geschrieben hat.
Da du von einer "Liste mit Dezimalzahlen" schreibst, gehe ich davon aus, dass die Liste nur die y-Werte enthält und somit die x-Werte als äquidistant angenommen werden. Dann ist der Mittelwert der Funktion, die durch lineare Interpolation zwischen jeweils zwei benachbarten gegebenen Funktionswerten entsteht, der Mittelwert der einzelnen Funktionswerte, wobei aber der erste und der letzten Funktionswert jeweils nur halb gewichtet werden. In Octave (und damit hoffentlich auch in Matlab) kann man das so schreiben:
1 | function m = meani(a) |
2 | n = length(a) |
3 | m = mean([(a(1)+a(n))/2, a(2:n-1)]) |
4 | end |
5 | |
6 | array = [2 4 3 6] |
7 | mittel = meani(array) |
Ergebnis:
1 | mittel = 3.6667 |
Vielen Dank Yalu X., Frank Meyer und Arc Net, ihr habt mich überzeugt, konnte mir vorher nicht vorstellen, dass das wirklich gleich ist. Hab noch mal drüber nachgedacht und der Mittelwert muss bei beiden Berechnungen gleich sein. Dann liegt mein Fehler wohl an anderer Stelle! Ich heul eigentlich in Foren ja nie rum und bin dankbar für jede Antwort auch wenn sie eventuell nicht weiter hilft, aber jetzt muss es mal kurz sein: Urschmitt, warum postest du in ein Topic nur um den Fragensteller bloßzustellen? Wenn du keine Lust auf unpräzise Fragen hast, ignoriere sie doch bitte einfach. Mit Antworten wie "Hääääh?" ist wirklich niemandem geholfen. Allen anderen: vielen Dank!
Ludwig K. schrieb: > konnte mir vorher nicht vorstellen, dass das wirklich gleich ist. Nein, der Mittelwert der einzelnen Funktionswerte und der Mittelwert der linear interpolierten Funktion sind i. Allg. verschieden. In meinem obigen Beispiel ist ersterer gleich 3,75 und letzterer gleich 3,67. Je größer die Anzahl der Funktionswerte ist, desto geringer wird allerdings der Unterschied zwischen den beiden Ergebnissen.
Ludwig K. schrieb: > Urschmitt, warum postest du in ein Topic nur um den Fragensteller > bloßzustellen? Das hast du selbst mit der Formulierung übernommen, ich habe nur umgangssprachlich zum Ausdruck gebracht daß ich den Sermon nicht verstehe. Ludwig K. schrieb: > Mit Antworten wie "Hääääh?" ist wirklich niemandem geholfen. Es war keine Antwort, sondern eine kurze prägnante Frage. Man kann statt dessen auch sagen "Wie meinst du das jetzt?". Es will halt nicht jeder Romane schreiben. Ansonsten: Schau dir die Netiquette zu Problembeschreibung an. Und denke daran: Das Problem sitzt manchmal vor der eigenen Tastatur
Ok, hm. Ja die Punkte sind äquidistant. Den Mittelwert berechne ich für jede Taktperiode, bei mir sind das 8 Punkte die ich für einen Mittelwert benutze. Dann befasse ich mich morgen mit interp1 und fertig ist. Danke!
Udo Schmitt schrieb: > Ansonsten: Schau dir die Netiquette zu Problembeschreibung an. Genau das hab ich gemacht. Neben den Tipps für Anfänger gibt es hier auch eine andere interessante Sache: "[...] Im Sinne eines konstruktiven und mindestens neutralen oder sogar freundlichen Miteinanders ist es geraten, solche Worte wie "Quatsch", "Unsinn" usw. zur Qualifizierung von Fragen oder Antworten zu vermeiden. Selbst wenn es nicht wirklich so gemeint ist, dass die Person abgewertet werden soll, ist es für den Leser doch oft schwer allein aus dem Text die Lesart zu entnehmen. [...]" Bitte berücksichtige das, auch ein "hääää" ist nicht neutral. Topic ist jetzt erledit.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.