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

Zufallsvariablen in Matritze speichern

 

runningp
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 08.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2017, 14:38     Titel: Zufallsvariablen in Matritze speichern
  Antworten mit Zitat      
Hallo zusammen,

ich stehe gerade vor einem Problem, das ich auch mit viel Herumprobieren bisher nicht lösen konnte.

Mein geschriebener Quellcode sieht wie folgt aus:

Code:


Zufallsgenerator=rand(1)*100000

A=[2x41] double
B=[1x41] double
C=[1x42] double
C_neu[1x41]double

max=sum(B(1:ceil(length(B)/2)));


if Zufallsgenerator<=max
   
    for k=1:ceil(length(B)/2)
   
        if Zufallsgenerator>=C(k) & Zufallsgenerator <= C_neu(k)
   
           Z=A(2,k);
 
        else Z=0;
       
                   
        end
 
       M(k)=Z;
       
    end
   
else
   
    for k=length(B):-1:ceil(length(B)/2)+1
   
        if Zufallsgenerator>=C(k) & Zufallsgenerator < C_neu(k)
   
           Z=A(2,k)
 
        else Z=0;
       
                   
        end
 
       M(k)=Z;
       
    end
   
   
   
end
Ma= M(M~=0)
 


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.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Knygs
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 26.03.15
Wohnort: ---
Version: 2015b, 2017a, 2021a
     Beitrag Verfasst am: 21.05.2017, 18:08     Titel:
  Antworten mit Zitat      
Hi runningp,

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 Wink

Code:
x=4;
Zufallsgenerator=rand(1,x)*10;

A=rand(2,41);
B=rand(1,41);
C=rand(1,41);
C_neu=rand(1,41)*10;

max=sum(B(1:ceil(length(B)/2)));
M1=zeros(size(Zufallsgenerator,2),(ceil(length(B)/2)));
M2=zeros(size(Zufallsgenerator,2),(ceil(length(B)/2)+1));

for i=1:size(Zufallsgenerator,2)
   
if Zufallsgenerator<=max
   
   M1(i,(C(1:ceil(length(B)/2))<=Zufallsgenerator(i))&(C_neu(1:ceil(length(B)/2))>=Zufallsgenerator(i)))=A(2,(C(1:ceil(length(B)/2))<=Zufallsgenerator(i))&(C_neu(1:ceil(length(B)/2))>=Zufallsgenerator(i)));
       
else
   M2(i,(C(ceil(length(B)/2)+1:end)<=Zufallsgenerator(i))&(C_neu(ceil(length(B)/2)+1:end)>=Zufallsgenerator(i)))=A(1,(C(ceil(length(B)/2)+1:end)<=Zufallsgenerator(i))&(C_neu(ceil(length(B)/2)+1:end)>=Zufallsgenerator(i))+ceil(length(B)/2)+1);
   
end
end
M=[M1,M2];
Ma= M(M~=0);


viele Grüße
Tobi
Private Nachricht senden Benutzer-Profile anzeigen
 
runningp
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 08.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2017, 21:33     Titel:
  Antworten mit Zitat      
Hallo Tino,

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

Über Lösungsvorschläge wäre ich sehr dankbar
Private Nachricht senden Benutzer-Profile anzeigen
 
runningp
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 08.05.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2017, 23:10     Titel:
  Antworten mit Zitat      
Habe das Problem nun doch noch selber gelöst bekommen mit folgendem Quellcode:

Code:

Zufallsgenerator=rand(1,Zufallsdaten)*100000

for n=1:Zufallsdaten

   
    for k=1:length(B)
   
        if Zufallsgenerator(n)>=C(k) & Zufallsgenerator(n) <= C_neu(k)
   
           Z=A(2,k);
 
        else Z=0;
       
                   
        end
  MatrixZ(k)=Z
  MatrixZ_neu= MatrixZ(MatrixZ~=0)  
       
       
    end
  Z_Werte(n)=MatrixZ_neu
   
end


 


lässt sich dieser in Bezug auf die Rechenzeit noch irgendwie optimieren?

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.05.2017, 09:44     Titel:
  Antworten mit Zitat      
Hallo,

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

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: 23.05.2017, 11:50     Titel:
  Antworten mit Zitat      
Hallo runningp,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Knygs
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 26.03.15
Wohnort: ---
Version: 2015b, 2017a, 2021a
     Beitrag Verfasst am: 23.05.2017, 16:03     Titel:
  Antworten mit Zitat      
Hallo runningp,

Der Fehler in meinem Code war lediglich in der if-Abfrage, dass ich vergessen habe das entsprechende Element zu benutzen. Die Zeile müsste heißen
Code:
if Zufallsgenerator(i)<=max


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
Code:
if Zufallsgenerator<=max

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

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