Mathematica nipid ja nõksud
ListPlot
punktide värvimine
21.05.2009
ListPlot
i punktidele saab ColorFunction
it rakendada vaid siis, kui nad on Joined
.
Kuid on lihtne võimalus seda siiski teha: tuleb iga punkt panna oma listi ja igaühe jaoks genereerida PlotStyle
komponent. Kui teil on näiteks kolmemõõtmeline list (mille z-koordinaat on lihtsuse mõttes 0 ja 1 vahel), pts = {{x1, y1, z1}, … }
tuleb teil kirjutadaListPlot[ {Take[#,2]}&/@pts, PlotStyle -> Evaluate[GrayLevel[Last[#]]&/@pts] ]
et esitada punktid halltoonides.
Tabeli taltsutus Mathematica 5
04.01.2005 (parandatud 13.11.2006)
- Tabeli taltsutuse kood Mathematica 5 märkmeraamatuna.
Oma renormrühma võrrandite lahendamise programmis pidin vektor- või maatriksfunktsioonid algtingimuste dimensioonide järgi käigu pealt konstrueerima funktsioonide vektorite või maatriksitena.
Viimaks leidsin, et aitab Array
. Näiteks kui funktsiooni algtingimuseks on 2×2 maatriks, mille Dimensions
on {2, 2}
, tagastab Array[f[##][x] &, {2, 2}]
indeksitega funktsioonide 2×2 maatriksi {{f[1, 1][x], f[1, 2][x]}, {f[2, 1][x], f[2, 2][x]}}{f[1,1][x], f[1,2][x]}, {f[2,1][x], f[2,2][x]}};
Vektorite ja maatriksitega pole muret. Aga arvudega? Arvu Dimensions
on {}
, mille peale Array
annab vea.
Mathematica 5.2 ei anna Array[f[##][t] &, {}]
enam mitte viga, vaid f[][t]
.
Array
’ile saab {}
jaoks defineerida suhteliselt mõistliku käitumise: Unprotect[Array]; Array[x_, {}] = First[Array[x, 1, 0]]; Protect[Array];
Siis Array[f[##][x] &, {}]
tagastab f[0][x]
. (Eelistan tagastada mitte ühe elemendiga massiivi, vaid selle elemendi.)
Kuid elegantsem lahendus on kasutada Table
’it muutuva arvu iteraatoritega.
Mathematica funktsioon Table
iteraatoreid vaikimisi välja ei arvuta. Näiteks iter = {i, 1, 3}; Table[f[i], iter]
annab tulemuseks veateate. (Samuti käituvad Do
, Sum
, Product
, jne.)
Tänan Bob Hanloni ja Arne Eidet sellele tähelepanu juhtimise eest.
See tuleb kirjutada kui iter = {i, 1, 3}; Table[f[i], iter//Evaluate];
Konstrueerime itereerimismuutujad ja iteraatorid üldisema juhu jaoks.
Näiteks 2×3 maatriksi korral saab iteraatorid selle dimensioonidest kui iters = Apply[Sequence, MapIndexed[{i[First[#2]], 1, #1} &, {2, 3}]];
mis tagastab Sequence[{i[1], 1, 2}, {i[2], 1, 3}];
Itereerimismuutujate jada meie 2×3 maatriksi jaoks on itervars = Apply[Sequence, Map[i[#] &, Range[Length[{2, 3}]]]];
Vastuolu arvu dimensiooniga nii ei teki: MapIndexed
annab {}
peale {}
, Sequence[{}]
haihtub, ja järgi jääb Table[f[]]
, mis tagastab lihtsalt f[]
.
Soovitan Mathematica loojatel:
- kõrvaldada vastuolu
Array
jaDimensions
vahel - Lisada
Table
’i jaoks funktsioon iteraatorite konstrueerimiseks massiiviDimensions
järgi.
Mustrite kombineerimine Mathematica 5
17.02.2005
- Alternatiivsete mustrite kood Mathematica 5 märkmeraamatuna.
Üks Mathematica tugevaid külgi on mustrite äratundmine. Alternatiivseid mustreid saab kombineerida |
abil.
Kuidas dünaamiliselt kombineerida suvalist arvu mustreid? Leidsin lühida lahenduse: Alternatives[patterns__] := With[{list = List[patterns]}, Fold[#1 | #2 &, First[list], Rest[list]]];
et veateate kaudu avastada — funktsioon Alternatives
on juba olemas!