|
|
|
Matrix erstellen "Gitter-Form" |
|
| CaroCS |

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.08.2011, 16:05
Titel: Matrix erstellen "Gitter-Form"
|
 |
Hallo!
Ich würde gerne eine (etwas große ) Matrix erstellen, die wie folgt aussehen soll:
( 1 0 0 0
0.99 0.01 0 0
0.99 0 0.01 0
0.99 0 0 0.01
0.98 0.2 0 0
...
0.98 0.1 0.1 0
0.98 0.1 0 0.01
... )
Es sollen also in 0.01-Schritten alle möglichen Kombinationen in der Matrix stehen, sodass in der Zeile die Summe 1 ergibt (also die Summe der 4 Werte pro Zeile = 1).
Wenn ich richtig gedacht/gerechnet habe wird die Matrix sehr groß (171.000 Zeilen).
Hoffe es ist verständlich, was ich da geschrieben habe?
Und noch mehr hoffe ich, dass es eine (einfache) Lösung zu dem Problem gibt?
Mit rand etc. bekomme ich nicht die gewünschte "Staffelung" in 0.01-Schritten, sondern lediglich beliebige Werte, die in der Summe 1 ergeben, hin...
Großes Dankeschön an alle Helfer!
Grüße
Caro
|
|
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 18.08.2011, 18:06
Titel:
|
 |
Hallo,
es mag schnellere Wege geben, was die Laufzeit angeht. Hier ist eine Lösung mit blockweiser Vorbelegung:
Edit: letzte Zeile leicht korrigiert.
Grüße,
Harald
Zuletzt bearbeitet von Harald am 18.08.2011, 18:59, insgesamt einmal bearbeitet
|
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 18.08.2011, 18:24
Titel:
|
 |
Super!
Klappt glaube ich für meine Zwecke ganz gut
Ich werds aber morgen nochmal genauer ausprobieren.
Die Berechnung geht jedenfalls Ruck Zuck.
Vielen lieben Dank!
|
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 21.08.2011, 12:06
Titel:
|
 |
| |
 |
|
Hallo!
So. Ich habe es jetzt noch mal ausprobiert. Es funktioniert vom Prinzip her, jedoch habe ich noch 2 Fragen:
Die Matrix M sieht wie folgt aus:
1 0 0 0
0.99 0 0 0.01
0.99 0 0.01 8.67361737988404e-18
0.99 0.01 0 8.67361737988404e-18
0.98 0 0 0.02
0.98 0 0.01 0.01
0.98 0 0.02 1.73472347597681e-17
0.98 0.01 0 0.01
0.98 0.01 0.01 1.73472347597681e-17
0.98 0.02 0 1.73472347597681e-17
...
D.h. an manchen Stellen ist statt einfach "0" eine Zahl die gegen 0 geht... Wie kann das sein, da der Code doch eigentlich auf Summen/Differenzen basiert? Wenn ich z.B. in Zeile 3 1-0.00-0.01 rechne, wieso setzt Matlab dann die 4. Spalte ("1-c1-c2-c3") nicht exakt gleich "0"? Dies könnte zu Problemen führen...
Kann man noch eine "Rundung" oder Ähnliches in den Code einbauen, sodass Matlab die Zahlen mit e^-17 durch 0 ersetzt und ich wirklich "0" als Wert erhalte?
Zweite Frage:
die Matrix enthält 176474 x 4 Werte; wenn ich aber die Struktur dahinter überlege müsste ich eigentlich genau 171.700 Zeilen erhalten:
=171.700
Enthält die Matrix M dann dementsprechend einige Werte doppelt? Vielleicht aufgrund der "falschen Nullen"?
|
|
|
|
| DSP |

Forum-Meister
|
 |
Beiträge: 2.117
|
 |
|
 |
Anmeldedatum: 28.02.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2014b
|
 |
|
|
 |
|
Verfasst am: 21.08.2011, 12:31
Titel:
|
 |
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 21.08.2011, 13:14
Titel:
|
 |
| |
 |
|
Hallo!
Das hatte ich probiert und habe aber nichts gefunden, wie ich auf 2 Nachkommastellen runden kann. Ich habe es aber auf deinen Hinweis hin noch einmal ausprobiert es jetzt einfach umgangen, indem ich mit 100 multipliziere und wieder teile. Ab und zu hilft ein Umweg eben doch
Kann sich dann jemand erklären, wie Matlab auf die Dimension der Matrix kommt? Wie gesagt: wenn ich mir das Muster hinter der Matrix ansehe, dann erhalte ich:
erste Stelle: 1.0 --> 1 Möglichkeit, die anderen 3 Felder in dert Zeile zu belegen...
erste Stelle: 0.99 --> 3 Möglichkeiten (1+2)
erste Stelle: 0.98 --> 6 Möglichkeiten (1+2+3)
etc.... bis
erste Stelle: 0.0 --> = 5151 Möglichkeiten
[Für die erste Stelle habe ich natürlich insgesamt 101(!) Möglichkeiten (von 1.0 in 0.01-Schritten bis 0), nicht nur 100, wie ich oben geschrieben habe]
Und wenn ich diese "Möglichkeiten" aufaddiere, komme ich auf eine andere Dimension, die die Matrix M haben müsste, als diejenige die mir Matlab ausgibt?
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 21.08.2011, 13:44
Titel:
|
 |
Hallo CaroCS,
Bitte prüfe doch mal per UNIQUE(X, 'rows') nach, ob die Matrix doppelte Zeilen entält.
Gruß, Jan
|
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 21.08.2011, 15:47
Titel:
|
 |
Hallo!
Ich habe jetzt noch einmal nachgerechnet:
eigentlich müsste die Matrix M 176.851 Zeilen enthalten; der Code liefert jedoch nur 176.474 Zeilen.
Mit 0.1er Schritten fällt auf, dass der Code aus irgendeinem Grund nicht alle Möglichkeiten erzeugt; ich denke, dass es an diesen komischen "nicht-Null"-Zahlen liegt (xyz*e^-17 usw.)...
Beispiel mit
liefert also z.B.:
1.0000 0 0 0
0.9000 0 0 0.1000
0.9000 0 0.1000 -0.0000
0.8000 0 0 0.2000
0.8000 0 0.1000 0.1000
........
d.h. der Code "vergisst", dass es auch noch die Kombination 0.9 0.1 0 0 gibt. Das könnte eben daran liegen, dass z.B. in der 3.Zeile des Output hinten keine "glatte Null" steht, sondern -0.0000000000000xyz?
Muss ich vielleicht vorher den Typ der Matrix M irgendwie anders definieren, dass Matlab "glatt" rechnet?
|
|
|
|
| Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 21.08.2011, 16:28
Titel:
|
 |
Hallo CaroCS,
Die Rundungsfehler sind wirklich ein Problem. Dann rechne einfach mit ganzen Zahlen:
Gruß, Jan
liefert also z.B.:
1.0000 0 0 0
0.9000 0 0 0.1000
0.9000 0 0.1000 -0.0000
0.8000 0 0 0.2000
0.8000 0 0.1000 0.1000
........
d.h. der Code "vergisst", dass es auch noch die Kombination 0.9 0.1 0 0 gibt. Das könnte eben daran liegen, dass z.B. in der 3.Zeile des Output hinten keine "glatte Null" steht, sondern -0.0000000000000xyz?
Muss ich vielleicht vorher den Typ der Matrix M irgendwie anders definieren, dass Matlab "glatt" rechnet?[/quote]
|
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 06.09.2011, 20:16
Titel:
|
 |
| |
 |
|
Hi!
Sorry, dass ich jetzt erst antworte!
Das mit der Matrix hat super funktioniert!
Vielen lieben Dank!!!
Jetzt sitze ich aber schon seit einer Stunde da und schaff es einfach nicht die Matrix anzupassen.
Mein Problem:
ich würde nun gerne eine Matrix konstruieren (wieder 4 Spalten), die mir pro Zeile eine Summe von 1 liefert, deren einzelne Zeilenkomponenten aber maximal 0.5 sein dürfen.
Beispiel:
0.5 0.5 0 0
0.5 0.49 0.01 0
0.5 0.49 0 0.01
0.5 0.48 0.02 0
0.5 0.48 0.01 0.01
...
...
0.49 0.5 0.01 0
...
...
...
Ich kriege es zwar hin, dass die ersten drei Spalten jeweils maximal den wert 0.5 annehmen, aber um dann insgesamt auf die Summe 1 zu kommen nimmt die letzte Spalte auch Werte bis 1 an...
Ich brauche also irgendwo die Bedingung, dass nicht gleichzeitig z.B. 3 Einträge pro Zeile = 0 sein dürfen usw., und die letzte Spalte dies dann ausgleichen muss...
Vielleicht kann mir noch mal jemand einen Denkanstoß geben?
Vielen Dank schonmal!
Einen schönen Abend!
|
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 06.09.2011, 20:41
Titel:
|
 |
So. Mit "if" hab ich jetzt etwas zusammenbekommen, das zumindest so aussieht als könnte es stimmen
Oder habe ich etwas übersehen/einen Fehler gemacht?
|
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 06.09.2011, 21:43
Titel:
|
 |
Nein. Falsch
Brauche also doch dringend Hilfe!...
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 06.09.2011, 21:48
Titel:
|
 |
Hallo,
wenn du weißt, wo das Problem liegt, weißt du ja fast schon auch, worans liegt.
Hinweis: du musst c3 auch nach unten begrenzen, da sonst 100-c1-c2-c3 zu groß wird.
Grüße,
Harald
|
|
|
|
| CaroCS |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 19
|
 |
|
 |
Anmeldedatum: 09.08.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 06.09.2011, 22:10
Titel:
|
 |
|
Der Fehler muss wohl schon bei c2 beginnen, da ich für c1=0 nur Werte c2=0.5 und einmal c2=0 bekomme und die ganzen Werte dazwischen beispielsweise fehlen...
|
|
|
|
| Harald |

Forum-Meister
|
 |
Beiträge: 24.502
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 07.09.2011, 17:28
Titel:
|
 |
Hallo,
du könntest dir ja z.B. mit dem Debugger anschauen, was hier passiert.
Ich vermute auf den ersten Blick, dass das Problem daran liegt, dass du in dieser for-Schleife
I nicht erhöhst (siehe die andere Schleife über c3).
Grüße,
Harald
|
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
|
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
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| 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.
|
|