DMUG-Archiv 2006

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

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

Guten Abend,

mit dem von Jens-Peer modifizierten Part[] Operator bleibt die Zuweisung weiterhin inkonsistent:

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

In[8]:= a = BesselJZeros[Pi, 8]
Out[8]= {110.92, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829, 38.5822, 32.2747}

In[9]:= a[[0]]
Out[9]= 110.92

In[10]:= a[[0]] = x
Out[10]= x

In[11]:= a[[0]]
Out[11]= 110.92

also a[[0]] != a[[0]] für das modifizierte Part[], a hat den Head gewechselt (default Verhalten):

In[12]:= a
Out[12]= x[110.92, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829, 38.5822, 32.2747]

Wenn man mit derselben Idee den Set[] Operator im Zusammenhang mit Part[] modifiziert

In[1]:= Unprotect[Part, Set]
hookPart = False;
hookSet = False;
Verbatim[Part][a_, seq___] /; Not[ hookPart] :=
 Block[{hookPart = True}, Part[a, Sequence @@ ( (# + 1) & /@ {seq})]]
Verbatim[Set][Verbatim[Part][a_, seq___], b_] /; Not[ hookSet] :=
Block[{hookSet = True}, Set[Part[a, Sequence @@ ( (# + 1) & /@ {seq})], b]]
Protect[Part, Set]

sieht das Ergebnis scheinbar gut aus:

In[7]:= a = {110.92, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829, 38.5822, 32.2747};

In[8]:= a[[0]]
Out[8]=110.92

In[9]:= a[[0]] = x
Out[9]=x

In[10]:= a[[0]]
Out[10]= x

In[11]:= a
Out[11]= {x, 29.1169, 6.5531, 19.6119, 38.5822, 44.8829, 38.5822, 32.2747}

Berechnet man die Bessel Nullstellen mit dem modifizierten Set[] nocheinmal:

In[12]:= Needs["NumericalMath`BesselZeros`"]
In[13]:= a = BesselJZeros[Pi, 8]
Out[13]= {3896.58, 10^-6, 1006.31, 10^-6, 186.336, 13.2095, 66.9094, 32.2747}

dann zeigt sich, dass es wiederum fehlerhaft ist. Im BesselZeros-Paket wird die Zuweisung auf Listenelemente verwendet, das geht jetzt an andere Positionen und die Numerik ist verloren (* "brauchbar" höchstens für Mma-Würmer, die solche Modifikationen in jemandes init.m Datei eintragen *). Nun kann man vor dem Aufruf von Mma-Package-Fktnen die Modifikationen abzuschalten versuchen, wandert von einem Problem zu nächsten und erleidet eine Art Chemotherapie des Symbolismus.

Der richtige Weg ist m.E. die Definition eines nullbasierten Indexoperators mit eigenen Symbolen, dazu wird Anleitung gegeben im HelpBrowser->Demos->Notebooks->New Notations.

Gruss
Udo.

Nowak Robert wrote:

BeginPackage["MyPart`"];
Part::usage="Part originated form 0 instead of 1";
Begin["`Private`"];
 hooked=True;
 Unprotect[Part];
Part[a_List, seq__] /; hooked := Block[{hooked = False}, Part[a, Sequence @@ ( # + 1 & /@ {seq})]];
 Protect[Part];
End[];
EndPackage[];




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

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