DMUG-Archiv 2006

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Antwort: Re: Indizierung von Tables mit Null beginnen.

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) erweitern

In[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}] > 1
            Protect[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]= 111

Die andere Form von Part, mit einer Sequence von Positionen, liefert das erste Element nullbasiert

In[77]:=  b[[0, 0, 0]]
Out[77]= 111

das letzte Elemtent steht auf i = 5, j = 4, k = 7 einsbasiert, also i = 4, j = 3, k = 6 nullbasiert

In[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
------------------------------------------------------------------









Antworten:
Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html