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.