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

Matrix erstellen "Gitter-Form"

 

CaroCS
Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 16:05     Titel: Matrix erstellen "Gitter-Form"
  Antworten mit Zitat      
Hallo!

Ich würde gerne eine (etwas große Wink ) 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? Wink
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
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.08.2011, 18:06     Titel:
  Antworten mit Zitat      
Hallo,

es mag schnellere Wege geben, was die Laufzeit angeht. Hier ist eine Lösung mit blockweiser Vorbelegung:

Code:
M = zeros(10000,4);
I = 1;
for c1 = 1:-0.01:0
    for c2 = 0:0.01:1-c1
        for c3 = 0:0.01:1-c1-c2
            M(I,:) = [c1 c2 c3 1-c1-c2-c3];
            I = I+1;
            if mod(I,10000) == 0
                M = [M; zeros(10000,4)];
            end
        end
    end
end
M(I:end,:) = [];
 


Edit: letzte Zeile leicht korrigiert.

Grüße,
Harald

Zuletzt bearbeitet von Harald am 18.08.2011, 18:59, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.08.2011, 18:24     Titel:
  Antworten mit Zitat      
Super!

Klappt glaube ich für meine Zwecke ganz gut Smile
Ich werds aber morgen nochmal genauer ausprobieren.
Die Berechnung geht jedenfalls Ruck Zuck.


Vielen lieben Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2011, 12:06     Titel:
  Antworten mit Zitat      
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:


 \sum\limits_{j=1}^{100} ( \sum\limits_{i=1}^j i ) =171.700


Enthält die Matrix M dann dementsprechend einige Werte doppelt? Vielleicht aufgrund der "falschen Nullen"?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 21.08.2011, 12:31     Titel:
  Antworten mit Zitat      
das Runden geht mit

Code:
fix(zahl)
% oder
round(zahl)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2011, 13:14     Titel:
  Antworten mit Zitat      
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 Wink

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 -->  \sum\limits_{j=1}^{101} j  = 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?
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: 21.08.2011, 13:44     Titel:
  Antworten mit Zitat      
Hallo CaroCS,

Bitte prüfe doch mal per UNIQUE(X, 'rows') nach, ob die Matrix doppelte Zeilen entält.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2011, 15:47     Titel:
  Antworten mit Zitat      
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
Code:
M = zeros(10000,4);
I = 1;
for c1 = 1:-0.1:0
    for c2 = 0:0.1:1-c1
        for c3 = 0:0.1:1-c1-c2
            M(I,:) = [c1 c2 c3 1-c1-c2-c3];
            I = I+1;
            if mod(I,10000) == 0
                M = [M; zeros(10000,4)];
            end
        end
    end
end
M(I:end,:) = [];


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?
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: 21.08.2011, 16:28     Titel:
  Antworten mit Zitat      
Hallo CaroCS,

Die Rundungsfehler sind wirklich ein Problem. Dann rechne einfach mit ganzen Zahlen:
Code:
M = zeros(10000,4);
I = 1;
for c1 = 100:-1:0
    for c2 = 0:100-c1
        for c3 = 0:100-c1-c2
            M(I,:) = [c1, c2, c3, 1-c1-c2-c3];
            I = I+1;
            if mod(I,10000) == 0
                M = [M; zeros(10000,4)];
            end
        end
    end
end
M(I:end,:) = [];
M = M / 100;

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]
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2011, 20:16     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2011, 20:41     Titel:
  Antworten mit Zitat      
Code:
M = NaN(50000,4);                    
I = 1;
for c1 = 50:-1:0
    for c2 = 50:-1:0
   if c1+c2<50
       for c3=50:-1:0
      M(I,:) = [c1 c2 c3 100-c1-c2-c3];
       end
   else
       for c3=0:1:100-c1-c2
      M(I,:) = [c1 c2 c3 100-c1-c2-c3];
      I = I+1;
       end
   end
    end
end
M(any(isnan(M),2),:)=[];
M=M/100;

clear c1 c2 c3 I


So. Mit "if" hab ich jetzt etwas zusammenbekommen, das zumindest so aussieht als könnte es stimmen Smile

Oder habe ich etwas übersehen/einen Fehler gemacht?
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2011, 21:43     Titel:
  Antworten mit Zitat      
Nein. Falsch Sad

Brauche also doch dringend Hilfe!... Crying or Very sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.09.2011, 21:48     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
CaroCS
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 19
Anmeldedatum: 09.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2011, 22:10     Titel:
  Antworten mit Zitat      
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...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.09.2011, 17:28     Titel:
  Antworten mit Zitat      
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
Code:

I nicht erhöhst (siehe die andere Schleife über c3).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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