DMUG-Archiv 2006

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

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

Schönen Nachmittag, Jens-Peer und Richard,

das ist ja alles sehr fein.


Man kann es noch feiner machen; die Rekursionsprobleme traten anscheinend nur auf, weil in meinem ersten Posting überflüssigerweise ein Module shiftedPart[] verwendet wurde. Es reicht,

Unprotect[Part]
Part /: Part[x_List, n_Integer] := First[RotateLeft[x, n]]
Part /: Part[x_List, n__Integer] := Fold[Part, x, {n}] /; Length[{n}] > 1
Part /: Part[x_List, l_List] := (Part[x, #]& /@ l) /; Length[l] > 0 && VectorQ[l, IntegerQ]
Protect[Part]

zu tippen, um Richards Wunsch nach nullbasierter Indizierung mit Mma. (5.2) zu erfüllen.

Allerdings möchte ich zu Bedenken geben,
<snip --- alles richtig --- snip>

Zu allem Überfluß ist Deine Variante, lieber Udo, ein ineffizientes Grauen ---


Probieren wir das aus, einmal in der nullbasierten Indizierung:

In[6]:= kuskaTab = Table[Unique[k], {o, 1, 90}, {oo, 1, 100}, {ooo, 1, 110}];

In[7]:= Length[Flatten[kuskaTab]]
Out[7]= 990000

In[8]:= (* Messung nullbasiert *)
           Timing[kuskaTab[[89, 99, 109]]]
Out[9]= {0. Second, k$990018}

In[10]:= Timing[Last[Flatten[kuskaTab]]]
Out[10]= {0.578 Second,k$990018}

das andere Mal in der einsbasierten (default) Indizierung in einer neuen Mma Session

In[1]:= kuskaTab = Table[Unique[k], {o, 1, 90}, {oo, 1, 100}, {ooo, 1, 110}];

In[2]:= Length[Flatten[kuskaTab]]
Out[2]= 990000

In[3]:= (* Messung einsbasiert *)
          Timing[kuskaTab[[90, 100, 110]]]
Out[4]= {0. Second,k$990018}

In[5]:= Timing[Last[Flatten[kuskaTab]]]
Out[5]= {0.563 Second,k$990018}

die nullbasierte Indizierung greift nicht langsamer zu als die einsbasierte. Das Flatten[] ist natürlich aufwendiger, da der gesamte Tensor von Klammern "gesäubert" werden muss.

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


Wie gesehen, hängt das von der Implementation von RotateLeft[x, k] ab, und da scheint Mma. effizient zu sein. Eine Abhängigkeit der Laufzeit von der Feldlänge wäre traurig an der Stelle (da müsste einer RotateLeft[x, n] als n Rufe RotateLeft[x, 1] implementiert haben - soetwas habe ich auch schon gesehen (objektorientiert ohne Sinn und Verstand) - würde es aber bei Wolfram nicht erwarten), man kann hinter den Kulissen Pointerarithmetik machen, denn es steht geschrieben, dass ein Grossteil des Mma. Kernels in C implementiert ist.

Auf jeden Fall viel Spaß beim Warten ...


Thanks und Schönen Sonntag allerseits
Udo.



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

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