Frühere | Chronologischer Index | Spätere | ||
Vorherige | Thematischer Index | Nächste |
Hallo, das ist ja alles sehr fein. Allerdings möchte ich zu Bedenken geben, das in den meisten Programmen Feld-Zugriffe *sehr* häufig sind. Ich habe schon C++ Programme gesehen, die weil schön Objekt-Orientiert, 70 % ihrer Laufzeit nur mit Feld-Zugriffen und Tests für das erlaubte Index-Intervall zugebracht haben. Es gilt so etwas zu vermeiden, wenn man nicht sehr viel Zeit mit Warten, Kaffeetrinken und Rauchen verbringen will, auch weil es nur ein geringes Maß an mentalen Fähigkeiten & geistigen Aufwand benötigt um die Indizierung umzustellen.Zu allem Überfluß ist Deine Variante, lieber Udo, ein ineffizientes Grauen --- ein Feld/List wird benutzt, um möglichst zufällig auf die Elemente zuzugreifen, mit
der Gewissheit, das jeder Zugriff die selbe Zeit benötigt (üblicherweise eine Interger-Multiplikation und eine Addition). Bei Dir braucht der Zugriff auf das k-te Element k-Operationen, je länger die Felder werden umso langsamer wird das Programm. Die konstante Zugriffszeit auf ein Element mit einem Feld mit n-Elementen ist also auf eine lineare Abhängigkeit des Zugriffs von der Feldlänge n umgewandelt worden. Damit wir aus einer einfachen Schleifen über alle Elemente ein n^2 Prozess, von mehr-dimensionalen Feldern will ich dabei mal schweigen ... Auf jeden Fall viel Spaß beim Warten ... Gruß Jens----- Original Message ----- From: "Udo und Susanne Krause" <su.krause@XXXXXXX.ch>
To: "Richard Gollreiter" <RGollreiter@XXXXXXX.de> Cc: <demug@XXXXXXX.ch> Sent: Friday, March 10, 2006 8:56 PM Subject: Re: Antwort: Re: Indizierung von Tables mit Null beginnen.
Hallo Richard,das kann man mit einer weiteren Zeile auf n-dimensionale Tabellen (Tensoren n-ter Stufe) erweiternIn[67]:= Unprotect[Part] Clear[Part] Part /: Part[x_List, n_Integer] := First[RotateLeft[x, n]]Part /: Part[x_List, n__Integer] := Fold[Part, x, {n}] /; Length[{n}] > 1Protect[Part] Out[67]= {Part} Out[71]= {Part} Probieren wir eine dreidimensionale Tabelle (Tensor 3-ter Stufe) b: In[74]:= Clear[b] b = Table[100 i + 10 j + k, {i, 1, 5}, {j, 1, 4}, {k, 1, 7}] Out[75]={{{111,112,113,114,115,116,117},{121,122,123,124,125,126,127}, {131,132,133,134,135,136,137},{141,142,143,144,145,146,147}}, {{211,212,213,214,215,216,217},{221,222,223,224,225,226,227}, {231,232,233,234,235,236,237},{241,242,243,244,245,246,247}}, {{311,312,313,314,315,316,317},{321,322,323,324,325,326,327}, {331,332,333,334,335,336,337},{341,342,343,344,345,346,347}}, {{411,412,413,414,415,416,417},{421,422,423,424,425,426,427}, {431,432,433,434,435,436,437},{441,442,443,444,445,446,447}}, {{511,512,513,514,515,516,517},{521,522,523,524,525,526,527},{531,532,533,534, 535,536,537},{541,542,543,544,545,546,547}}}In[76]:= b[[0]][[0]][[0]] Out[76]= 111Die andere Form von Part, mit einer Sequence von Positionen, liefert das erste Element nullbasiertIn[77]:= b[[0, 0, 0]] Out[77]= 111das letzte Elemtent steht auf i = 5, j = 4, k = 7 einsbasiert, also i = 4, j = 3, k = 6 nullbasiertIn[78]:= b[[4]][[3]][[6]] Out[78]= 547 In[79]:= b[[4, 3, 6]] Out[79]= 547 Gruss Udo. Richard Gollreiter wrote:Hallo Udo, kannst Du diese elegante Lösung auch auf zwei-dimensionale Tabellen erweitern? Gruß Richard ------------------------------------------------------------------
Frühere | Chronologischer Index | Spätere | ||
Vorherige | Thematischer Index | Nächste |
DMUG-Archiv, http://www.mathematica.ch/archiv.html