Mathematica: Tutorial 5

Dane czyli listy

Jedno z trudniejszych zagadnień to sposób przechowywania danych przez Mathematice. Mathematica pozwala na grupowanie elementów. Aby kilka elementów zgrupować wystarczy umieścić je w nawiasach klamrowych, oddzielając przecinkami:

In[1]:= {1, 2, 3}
Out[1]= {1,2,3}
In[2]:= a = {2, 3, 4}
Out[2]= {2,3,4}

Na takich obiektach można wykonywać najróżnorodniejsze operacje:

In[1]:= {1, 2, 3}
In[3]:= x^a - 1
Out[3]= {-1+x^2,-1+x^3,-1+x^4}
In[4]:= D[%, x]
Out[4]= {2 x,3 x^2,4 x^3}

Jeżeli zechcemy “podmienić” x na jakąś wartość możemy zapisać to tak:

In[1]:= {1, 2, 3}
In[5]:= % /. x -> 3
Out[5]= {6,27,108}

Większość operacji wykonywanych przez Mathematice jest tak skonstruowana, ze jest “listoodporna” to znaczy ich argumentem może być lista…

In[1]:= {1, 2, 3}
In[6]:= {3, 5, 1}^2 -1
Out[6]= {8,24,0}
In[7]:= {6, 7, 8} - {3.5, 12, 1.8}
Out[7]= {2.5,-5,6.2}
In[8]:= Exp[ % ] // N
Out[8]= {12.1825,0.00673795,492.749}
In[9]:= u = {2, 4, 3.1}
Out[9]= {2,4,3.1}
In[10]:= u/(u-1)
Out[10]= {2,4/3,1.47619}

Tablice

Lista wartości może być używana jako tablica. Tablice można też wygenerować wyliczając wartość jakiegoś wyrażenia dla zadanych argumentów:

In[1]:= {1, 2, 3}
In[11]:= Table[i^2, {i,6}]
Out[11]= {1,4,9,16,25,36}

albo

In[1]:= {1, 2, 3}
In[12]:= z = Table[Sin[n/5], {n,0,4}]
Out[12]= {0,Sin[1/5],Sin[2/5],Sin[3/5],Sin[4/5]}

Aby wyliczyć wartość powyższego wystarczy napisać:

In[13]:= N[%]
Out[13]= {0.,0.198669,0.389418,0.564642,0.717356}

Inny przykład tablicy zbudowanej z formul:

In[14]:= Table[x^i - 2i, {i,5}]
Out[14]= {-2+x,-4+x^2,-6+x^3,-8+x^4,-10+x^5}
In[15]:= Sum[x^i -2i, {i,5}]
Out[15]= -30+x+x^2+x^3+x^4+x^5
In[16]:= Product[x^i -2i, {i,5}]
Out[16]= (-2+x) (-4+x^2) (-6+x^3) (-8+x^4) (-10+x^5)

Polecenia Table używa dokładnie takiego samego sposobu zapisu jak polecenia Sum lub Product…

In[1]:= {1, 2, 3}
In[17]:= z
Out[17]= {0,Sin[1/5],Sin[2/5],Sin[3/5],Sin[4/5]}
In[18]:= z // TableForm
Out[18]//TableForm= 
0
Sin[1/5]
Sin[2/5]
Sin[3/5]
Sin[4/5]

Polecenie TableForm pozwala wypisać zawartość listy w postaci tablicy:

In[1]:= {1, 2, 3}
In[19]:= u = Table[x^i + y^j, {i,3}, {j,2}]
Out[19]= {{x+y,x+y^2},{x^2+y,x^2+y^2},{x^3+y,x^3+y^2}}
In[20]:= u // MatrixForm
Out[20]//MatrixForm= 

$$\left(\begin{array}{cc} x+y & x+y^2\ x^2+y & x^2+y^2\ x^3+y & x^3+y^2 \end{array}\right)$$

In[21]:= RandomReal[{0,1},{4,4}]
Out[21]= {{0.528857,0.990923,0.135856,0.106767},{0.428128,0.615336,0.876126,0.501554},{0.405531,0.241396,0.136452,0.282462},{0.879369,0.421658,0.380288,0.316436}}

Manipulowanie elementami listy

In[1]:= {1, 2, 3}

Part[list, i] albo list[[i]] pozwala wyciągnąć $i$-ty element listy

In[22]:= {5, 8, 6, 9}[[2]]
Out[22]= 8

Poniższe jest nieco pokręcone - ale o co chodzi? i czemu tak jest?

In[1]:= {1, 2, 3}
In[23]:= {5, 8, 6, 9}[[ {3, 1, 2, 3, 4} ]]
Out[23]= {6,5,8,6,9}

i pozwala na przekształcanie list wedle własnego wyboru

In[25]:= u[[2]] + u[[3]] + u[[4]]
During evaluation of In[25]:= Part::partw: Part 4 of {{x+y,x+y^2},{x^2+y,x^2+y^2},{x^3+y,x^3+y^2}} does not exist.
Out[25]= {x^2+x^3+2 y+{{x+y,x+y^2},{x^2+y,x^2+y^2},{x^3+y,x^3+y^2}}[[4]],x^2+x^3+2 y^2+{{x+y,x+y^2},{x^2+y,x^2+y^2},{x^3+y,x^3+y^2}}[[4]]}
In[26]:= u[[3]] = 0
Out[26]= 0
In[27]:= u
Out[27]= {{x+y,x+y^2},{x^2+y,x^2+y^2},0}

W ten sposób możemy zmienić wartość jednego elementu listy (użycie notacji Part tez jest możliwe!

Nawiasy w Mathematici

Dobry moment żeby dokonać drobnego podsumowania: pojedyncze nawiasy kwadratowe używane są do wskazania argumentów funkcji; nawiasy klamrowe służą do definiowania list, podwójne nawiasy kwadratowe pozwalają odwołać się do elementu listy… nawiasy okrągłe używane są do grupowania fragmentów wyrażeń arytmetycznych Wektory i macierze {a, b, c} to wektor o trzech elementach {{a, b}, {c, d}} to tablica $\left(\begin{array}{cc}a & b\c &d\end{array}\right)$

In[1]:= {1, 2, 3}
In[28]:= Clear[a,u,v,  p, q]

Tak na marginesie — polecenie Clear pozwala skasować niepotrzebny symbol

In[1]:= {1, 2, 3}
In[29]:= m={{a, b}, {c, d}}
Out[29]= {{a,b},{c,d}}
In[30]:= m[[1]]
Out[30]= {a,b}

Czyli m[[1]] wyciąga z listy jej pierwszy element (który tez jest listą).

In[1]:= {1, 2, 3}
In[31]:= m[[2]][[2]]
Out[31]= d

Powyższy, nieco skomplikowany zapis, można zastąpić prostszym:

In[1]:= {1, 2, 3}
In[32]:= m[[2,2]]
Out[32]= d
In[33]:= v = {x, y}
Out[33]= {x,y}
In[34]:= p v+q
Out[34]= {q+p x,q+p y}
In[35]:= v + {xp, yp} + {xpp, ypp}
Out[35]= {x+xp+xpp,y+yp+ypp}

Wektory dodawane są składowa po składowej… Produkt skalarny wektorów oznaczamy za pomocą kropki (.)

In[1]:= {1, 2, 3}
In[36]:= {x, y} . {xp, yp}
Out[36]= x xp+y yp

Można pomnożyć macierz przez wektor

In[1]:= {1, 2, 3}
In[37]:= m . v
Out[37]= {a x+b y,c x+d y}

Albo macierz przez macierz

In[1]:= {1, 2, 3}
In[38]:= m . m
Out[38]= {{a^2+b c,a b+b d},{a c+c d,b c+d^2}}
In[39]:= v. m
Out[39]= {a x+c y,b x+d y}
In[40]:= v. m . v
Out[40]= x (a x+c y)+y (b x+d y)

Ubocznym efektem użycia list do zapisywania wektorów jest brak możliwości odróżnienia wektora „kolumnowego” od „wierszowego” (czy to oznacza ze takie rozróżnienie jest bez sensu? Zatem poniższe nie ma sensu:

In[1]:= {1, 2, 3}
In[41]:= Transpose[{a, b}]
Out[41]= {a,b}

Ale to już ma:

In[1]:= {1, 2, 3}
In[42]:= Transpose[{{a, b}, {c, d}}]
Out[42]= {{a,c},{b,d}}

Do wczytania danych z pliku zewnętrznego służy polecenie Import, a zapisu danych do pliku — Export. Mathematica potrafi wczytywać dane w różnorodnych postaciach (łącznię z graficznymi — to jest dobry przykład tablicy}:

In[1]:= {1, 2, 3}
In[43]:= SetDirectory["/home/myszka/Dokumenty/teksty/Dydaktyka/Mathematica/M/Przyklad5"];
In[44]:= Import["d.png"];
In[45]:= Show[%]
Out[45]= 

Przykład zaimportowanej grafiki
Przykład zaimportowanej grafiki

Polecenia $ImportFormats oraz $ExportFormats podają formaty, których można używać podczas importu i eksportu danych

In[46]:= $ImportFormats
Out[46]= {3DS,7z,AC,ACO,Affymetrix,AgilentMicroarray,AIFF,ApacheLog,ArcGRID,ASC,ASE,AU,AVI,Base64,BDF,Binary,BioImageFormat,Bit,BLEND,BMP,BREP,BSON,Byte,BYU,BZIP2,CDED,CDF,CDX,CDXML,Character16,Character32,Character8,CIF,CML,Complex128,Complex256,Complex64,CSV,Cube,CUR,DAE,DBF,DICOM,DICOMDIR,DIF,DIMACS,Directory,DOCX,DOT,DTA,DXF,EDF,EML,EPS,ExpressionJSON,ExpressionML,FASTA,FASTQ,FBX,FCHK,FCS,FITS,FLAC,FLV,GaussianLog,GenBank,GeoJSON,GeoTIFF,GIF,GLTF,GPX,Graph6,Graphlet,GraphML,GRIB,GTOPO30,GXF,GXL,GZIP,HarwellBoeing,HDF,HDF5,HIN,HTML,HTTPRequest,HTTPResponse,ICC,ICNS,ICO,ICS,IFC,IGES,Ini,Integer128,Integer16,Integer24,Integer32,Integer64,Integer8,ISO,JavaProperties,JavaScriptExpression,JCAMP-DX,JPEG,JPEG2000,JSON,JSONLD,JVX,KML,LaTeX,LEDA,List,LWO,LXO,MAT,MathML,Matroska,MBOX,MCTT,MDB,MESH,MGF,MIDI,MMCIF,MO,MOBI,MOL,MOL2,MP3,MP4,MPS,MS3D,MTP,MTX,MX,MXNet,NASACDF,NB,NDK,NetCDF,NEXUS,NOFF,NQuads,NTriples,OBJ,ODS,OFF,Ogg,ONNX,OpenEXR,OSM,OWLFunctional,Pajek,PBM,PCAP,PCX,PDB,PDF,PEM,PGM,PHPIni,PLY,PNG,PNM,POR,PPM,PXR,PythonExpression,QuickTime,RAR,Raw,RawBitmap,RawJSON,RData,RDFXML,RDS,Real128,Real32,Real64,RIB,RLE,RSS,RTF,SAS7BDAT,SAV,SCT,SDF,SDTS,SDTSDEM,SFF,SHP,SMA,SME,SMILES,SND,SP3,SPARQLQuery,SPARQLResultsJSON,SPARQLResultsXML,SPARQLUpdate,Sparse6,STEP,STL,String,SurferGrid,SVG,SXC,Table,TAR,TerminatedString,TeX,Text,TGA,TGF,TIFF,TIGER,TLE,TriG,TSV,Turtle,UBJSON,UnsignedInteger128,UnsignedInteger16,UnsignedInteger24,UnsignedInteger32,UnsignedInteger64,UnsignedInteger8,USD,USGSDEM,UUE,VCF,VCS,VideoFormat,VTK,WARC,WAV,Wave64,WDX,WebP,WL,WLNet,WMLF,WXF,X3D,XBM,XGL,XHTML,XHTMLMathML,XLS,XLSX,XML,XPORT,XYZ,ZIP,ZSTD}
In[47]:= $ExportFormats
Out[47]= {3DS,AC,ACO,AIFF,ASE,AU,AVI,Base64,Binary,Bit,BLEND,BMP,BREP,BSON,Byte,BYU,BZIP2,C,CDF,CDXML,Character16,Character32,Character8,CML,Complex128,Complex256,Complex64,CSV,Cube,CUR,DAE,DICOM,DIF,DIMACS,DOT,DTA,DXF,EPS,ExpressionJSON,ExpressionML,FASTA,FASTQ,FBX,FCS,FITS,FLAC,FLV,FMU,GeoJSON,GIF,GLTF,Graph6,Graphlet,GraphML,GXL,GZIP,HarwellBoeing,HDF,HDF5,HIN,HTML,HTMLFragment,HTTPRequest,HTTPResponse,ICNS,ICO,IFC,IGES,Ini,Integer128,Integer16,Integer24,Integer32,Integer64,Integer8,ISO,JavaProperties,JavaScriptExpression,JPEG,JPEG2000,JSON,JSONLD,JVX,KML,LEDA,List,LWO,LXO,MAT,MathML,Matroska,Maya,MCTT,MGF,MIDI,MO,MOL,MOL2,MP3,MP4,MS3D,MTX,MX,MXNet,NASACDF,NB,NetCDF,NEXUS,NOFF,NQuads,NTriples,OBJ,OFF,Ogg,ONNX,OpenEXR,OWLFunctional,Pajek,PBM,PCX,PDB,PDF,PGM,PHPIni,PLY,PNG,PNM,POR,POV,PPM,PXR,PythonExpression,QuickTime,RawBitmap,RawJSON,RDFXML,Real128,Real32,Real64,RIB,RLE,RTF,SAS7BDAT,SAV,SCT,SDF,SMA,SMILES,SND,SPARQLQuery,SPARQLResultsJSON,SPARQLResultsXML,SPARQLUpdate,Sparse6,STEP,STL,String,SurferGrid,SVG,Table,TAR,TerminatedString,TeX,TeXFragment,Text,TGA,TGF,TIFF,TriG,TSV,Turtle,UBJSON,UnsignedInteger128,UnsignedInteger16,UnsignedInteger24,UnsignedInteger32,UnsignedInteger64,UnsignedInteger8,USD,UUE,VideoFrames,VRML,VTK,WAV,Wave64,WDX,WebP,WL,WLNet,WMLF,WXF,X3D,XBM,XGL,XHTML,XHTMLMathML,XLS,XLSX,XML,XPORT,XYZ,ZIP,ZPR,ZSTD}
Poprzedni
Następny