Die Programmierung funktioniert einwandfrei, d. h. ich generiere über 'rand' eine Zufallszahl und 'Ma' gibt mir den zur Zufallszahl entsprechenden Wert aus der Tabelle aus.
Da ich allerdings mehrere Werte aus der Tabelle brauche, wäre das Ziel, dass ich beispielsweise über 'rand(1,x)' eine Matritze mit 'x' Zufallswerten habe und 'Ma' in der Matritze der selben Größe die entsprechenen Werte aus der Tabelle generiert, mit denen ich dann weiter arbeiten kann.
Ich habe es bereits über eine zusätzliche forschleife probiert allerdings schreibt mir Matlab bis auf das letzte Element nur Nullen in die Matrix.
Ich hoffe ihr könnt mir bei diesem Problem helfen.
wenn ich dein Problem richtig verstanden habe, dann kann man es durch das Hinzufügen einer weiteren Dimension in der Ergebnismatrix und somit durch eine zusätzliche Schleife lösen.
Ich stelle mir das im Endeffekt so vor, wobei ich deine ursprüngliche Schleife durch diese "Monsterzeilen" ersetzt habe. Im Endeffekt macht meine Zeile das Gleiche wie deine Schleifen, nur dass es jetzt als Matrix-Operation/Vergleich geschieht. Dadurch, dass Matlab darauf optimiert ist wird das bei großen Datenmengen deutlich effizienter sein
danke für deine Mühe, allerdings muss da ein Fehler in deinem Quellcode sein
da für x=1 mir zwei-fünf Zufallswerte über Ma ausgegeben werden. erhöhe ich x, so werden die Werte von x=1 einfach nur geklont und eine Zeile darunter gespeichert nur um eine Spalte versetzt.
Außerdem bleibt bei egal welcher Eingabe von x, M2 immer eine Zero Matrix.
Konkret zu meiner Aufgabe:
Ich habe über die Gaussche Normalverteilung Wahrscheinlichkeiten berechnet die in der ersten Zeile gespeichert sind, in der zweiten Zeile sind die dazugehörigen Höhen hinterlegt.
Beispiel: A=[2.1 2.8, 0.1 0.2] oder in Worten die Höhe 0.1 kommt mit einer Wahrscheinlichkeit von 2.1% vor, während die Höhe 0.2 mit 2.8% Wahrscheinlichkeit auftritt.
Nun hatte ich mir überlegt eine neue Matrix C zu entwerfen, die mir die Werte von A so transformiert, dass ich mit der Zufallszahl leichter rechnen kann.
Beispiel: C=[0 2.1 4.9] liegt die Zufallszahl zwischn 0 und 2.1 so wird die Höhe 0.1 ausgegeben. liegt der Wert zwischen 2.1 und 4.9 so wird 0.2 ausgegeben.
Nach diesem Prinzip sollen also alle enthaltenen Elemente der Zufallsmatrix darauf geprüft werden zwischen welchen Referenzwerten diese liegen und dann die richtigen Höhen unter Berücksichtigung der Wahrscheinlichkeit in einer Matrix gespeichert werden
lässt sich dieser in Bezug auf die Rechenzeit noch irgendwie optimieren?
Sowas hängt sehr von den Dimensionen der beteiligten Variablen ab. Daher bitte immer reproduzierbaren Code zur Verfügung stellen. Statt der tatsächlichen Daten können gerne Zufallsmatrizen verwendet werden, nur die Dimensionen sollten stimmen.
Ja, das lässt sich beschleunigen, indem Du die Erbegnis-Arrays pre-allozierst. Allerdings ist der bisherige Code noch nicht sinnvoll: "MatrixZ_neu" wird immer wieder überschrieben und zum Schluß wird in "Z_Werte(n) = MatrixZ_neu" der Vektor "MatrixZ_neu" dem Scalar "Z_Werte(n)" zugewiesen.
Bisher ist der Code also nicht langsam, sondern er läuft gar nicht.
Was den Rest angeht:
Natürlich werden in meinem Code irgendwo immer dieselben Zahlen auftauchen. Das liegt daran, dass du keine Daten zur Verfügung gestellt hast und ich mir selbst welche generieren musste.
Zusätzlich zu dem Fehler, den Jan bereits angemerkt hat hast du in deinem zweiten Codesegment die Unterscheidung
aus deinem ersten Beispiel nicht mehr eingebaut.
Das kann, je nach Daten, zu einem ganz anderen Ergebnis führen, da du im ersten Beispiel jeweils nur die erste bzw zweite Hälfte von C, C_neu und A benutzt hast und das später unter den Tisch fallen lässt und immer über die gesamte Länge betrachtest.
Was die Laufzeit angeht habe ich die Erfahrung gemacht;
viele Schleifendurchläufe sind ineffizient also statt großen Schleifen lieber Matrix-Operationen verwenden. (wie bereits geschrieben, wobei wenn du meine Antwort genauso aufmerksam gelesen hast wie meinen Namen... )
vg
Tobi
Einstellungen und Berechtigungen
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.