DMUG-Archiv 2006

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

Re: Indizierung von Tables mit Null beginnen.

Hallo Richard und Patrick nocheinmal,

es gibt eine freche Lösung ...

In[99]:= Unprotect[Part]
            Clear[Part]
            Part /: Part[x_List, n_Integer] := First[RotateLeft[x, n]]
            Protect[Part]
Out[99]=   {Part}
Out[102]= {Part}

Durch Clear[Part] entledigt man sich einerseits der Rekursionsprobleme, andererseits der built-in Funktionalität von Part.

In[107] := Needs["NumericalMath`BesselZeros`"]

In[108]:= a = BesselJZeros[Pi, 4]
Out[108]= {25.9552, 32.2747, 25.9552, 19.6119}

In[109]:= a[[0]]
Out[109]= 25.9552

In[110]:= a[[3]]
Out[110]= 19.6119

Gruss
Udo.

Udo und Susanne Krause wrote:

Hallo Richard und Patrick,

das (echte) Part[] lässt sich mit Unprotect[] und Protect[] behandeln, weil Part[] nicht das Attribute Locked hat. In dem Fall ist es aber schwierig, das Unangenehme mit dem Nutzlosen zu verbinden:

In[13] := Clear[gollreiterTable, shiftedPart]
gollreiterTable[n_Integer?NonNegative, type_Symbol] := Table[Random[type], {n}] /; (type === Integer || type === Real || type === Complex);
shiftedPart[x_List, n_Integer] := First[RotateLeft[x, n]];
(*
Unprotect[Part]
Part /; Part[x_List, n_Integer] := shiftedPart[x, n];
Protect[Part]
*)

In[18]:=
Clear[a];
a = gollreiterTable[5, Complex]

Out[19]=
{0.241481 + 0.138648 I, 0.473792 + 0.952719 I, 0.905932 +0.628482 I, 0.36624 + 0.259079 I, 0.318215 + 0.303649 I}

In[20]:= shiftedPart[a, 0]
Out[20]= 0.241481 +0.138648 I

In[22]:= shiftedPart[a, 0] == shiftedPart[a, Length[a]]
Out[22]= True

Soweit so gut. Den auskommentierten Teil können Sie erst dann aktivieren, wenn Sie in shiftedPart[] eine Zugriffsmethode auf die Elemente einer Liste gefunden haben, die vollständig unabhängig von Part[] ist - anderenfalls laufen Sie in eine unendliche Rekursion, freundlicherweise von Mma. beim $RecursionLimit unterbrochen. First[] ist zu diesem Zweck selbstverständlich ungeeignet, Versuche mit Take[_, {1, 1}], Pick[] usw. haben auch keinen Erfolg gehabt.

Gruss
Udo.


Patrick Scheibe wrote:

Moin.

Also der echte [[]] Operator laesst sich nicht umbiegen glaub ich.
Das waer auch fatal, weil ja fast jede Funktion darauf zurueck greift.
Falls es wirklich von Noeten ist, dann kann man sich natuerlich einen Wrapper um die eigentliche Funktion Part[] schreiben. Nur das ist noch viel unintuitiver, denn expr[[0]] gibt den Head der expr zurueck.

Bei C/C++ liegt die Sachlage ja anders. Dort hat man ja Pointer und die Zahl in den Brackets gibt nur die Verschiebung diese Pointers an. In MMA kann man mit dem Part[] Operator sich Teile jeder Expression geben lassen. Nicht nur bei Listen..

Cheers
Patrick
On Tuesday 07 March 2006 12:29, Richard Gollreiter wrote:
Hallo Demug,

gibt es einen Trick, wie ich Tables mit Null beginnend indizieren kann (wie
in C)?
Ein Beispiel hierzu:

In[27]:=  T=Table[i,{i,0,9}]

Out[27]=  {0,1,2,3,4,5,6,7,8,9}

In[28]:=  T[[1]]

Out[28]=  0

Ich möchte aber mit Indizes 0 ..9 auf die Tabelle zugreifen können
anstatt mit 1..10 .

Danke
Richard Gollreiter
------------------------------------------------------------------




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

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