DMUG-Archiv 2006

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

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

Lieber Udo,

natürlich hat Du Recht, es ist unsinnig, absurd
und nicht besonders clever Part[] umzudefinieren,
weil dann alle Mathematica Packages die Part[] 
benuzten
und von Leuten geschrieben worden sind, deren
geistige Fähigkeiten ausreichen um von Index-Basis 
0 auf
Index-Basis 1 zu wechseln, nicht mehr korrekt
funktionieren.

Die Frage von Robert Nowak war aber

>>wünschenswert wäre es doch (nicht nur bei Part 
>>sondern generell
>> bei allen system funktionen) bei umdefinition 
>> von Part[]
>>innerhalb der neudefinition auf das originale 
>>Part[] zugreifen zu können.

und die Antwort darauf, kann man nun mal nicht für
"die Definition eines nullbasierten Indexoperators 
mit eigenen Symbolen"
geben.

Desweiteren kann man problemlos die Aufrufe an 
solche Funktionen mit einem
Block[{hookPart = True,hookSet = True},...] 
kapseln

Needs["NumericalMath`BesselZeros`"]

Block[{hookPart = True,hookSet = True},
  a = BesselJZeros[Pi, 8]
 ]

wenn man ein Mathematica-Package benutzt. Gerade 
deshalb
war es mir ja so wichtig, die  hook*-Flags *nicht* 
zu kapseln.

Ansonsten hat der OP ja erklärt, das er dieses 
feature für das
prototyping benutzen will und in einem Prototyp 
wird man
den Aufruf von Mathematica Packages vermeiden, 
einfach weil
man diese Funktionen ja dann im C-Programm eh 
nicht hat.
Insofern sollte es eher selten dazu kommen, daß 
man die
BlockBlock[{hookPart = True,hookSet = True},...] 
Version braucht,
falls doch gelingt es immer noch mit

SetOptions[originalEval,HoldAll]

originalEval[expr_]:=
  BlockBlock[{hookPart = True,hookSet = 
True},Evaluate[expr]]

diese Aufrufe im Prototyp vor dem modifizierten 
Part[] zu
schützen ...

Gruß
  Jens

PS: und ja, ich finde es überflüssig so etwas 
*uberhaupt* zu machen
weil es ziemlich einfach ist ein

For[i=1,i<=n,i++,
  lst[[i]]=something[i,x]
 ]

in

for(int i=0; i<n; i++)
  lst[i]=something(i,x);

zu übersetzen. Die einzige Stelle die mir je als
problematisch aufgefallen ist, sind Pivot-Felder.


----- Original Message ----- 
From: "Udo und Susanne Krause" 
<su.krause@XXXXXXX.ch>
To: "Nowak Robert" <robert.nowak@XXXXXXX.at>
Cc: "Jens-Peer Kuska" 
<kuska@XXXXXXX.de>; 
<demug@XXXXXXX.ch>; "Richard Gollreiter" 
<RGollreiter@XXXXXXX.de>
Sent: Wednesday, March 15, 2006 10:07 PM
Subject: 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