FAQ czyli Czasami Zadawane Pytania
Mathematica
- W jaki sposób z tablicy wydobyć cały wiersz albo całą kolumnę?Niech mat będzie tablicą dwuwymiarową, utworzoną, na przykład poleceniem:
12mat = Table[Subscript[m, i, j], {i, 5}, {j, 5}];mat // MatrixForm
\(\left( \begin{array}{ccccc} m_{1,1} & m_{1,2} & m_{1,3} & m_{1,4} & m_{1,5} \\ m_{2,1} & m_{2,2} & m_{2,3} & m_{2,4} & m_{2,5} \\ m_{3,1} & m_{3,2} & m_{3,3} & m_{3,4} & m_{3,5} \\ m_{4,1} & m_{4,2} & m_{4,3} & m_{4,4} & m_{4,5} \\ m_{5,1} & m_{5,2} & m_{5,3} & m_{5,4} & m_{5,5} \\ \end{array} \right)\)Aby dobrać się do wybranego elementu używamy funkcji Part:
1Part[mat, 1, 2]albo „skrótu”
[[...]]
1mat[[1,2]]Aby wydobyć cały wiersz wystarczy użyć polecenia:
1mat[[4]]\(\left\{m_{4,1},m_{4,2},m_{4,3},m_{4,4},m_{4,5}\right\}\)
natomiast aby wydobyć kolumnę:1mat[[All,4]]\(\left\{m_{1,4},m_{2,4},m_{3,4},m_{4,4},m_{5,4}\right\}\)
Dodatkowo funkcja Span (której skrótem jest
;;
pozwala wybrać dowolną „podtablicę” z tablicy:1mat[[1 ;; 2, 3 ;; 5]]\(\left( \begin{array}{ccc} m_{1,3} & m_{1,4} & m_{1,5} \\ m_{2,3} & m_{2,4} & m_{2,5} \\ \end{array} \right)\)
- Jak utworzyć macierz o wymiarach \(n\times m\), której zawartością są same zera?
1A = Table[0, {i, n}, {i, m}]
\(\left( \begin{array}{cccc} 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \\ \end{array} \right)\)
- W jaki sposów wstrzymać wypisywanie zawartości wyników obliczeń (na przykład tablic) na ekranie?Na końcu polecenia należy umieścić śednik.
- W jaki sposób dodać (usunąć) element listy?Służą do tego polecenia Append (dodaj na końcu), Prepend (dodaj na początku), Insert (wstaw), Riffle (wstaw między elementami listy), ReplacePart (zamień) Delete (usuń). Dobry tutorial jest tu w helpie Mathematici oraz na stronach WWW.Dodanie elementu \(a\) na końcu listy \(l\): Append[l,a]:\(\pmb{l=\{1,2,3\}}\)\(\{1,2,3\}\)\(\pmb{a=4;}\)\(\pmb{l=\text{Append}[l,a];}\)\(\pmb{l}\)\(\{1,2,3,4\}\)W szczególności działa coś takiego:
\(\pmb{L=\{\}}\)
\(\{\}\)
\(\pmb{\text{For}[i=0, i<10, i\text{++}, L=\text{Append}[L, i]]}\)
\(\pmb{L}\)
\(\{0,1,2,3,4,5,6,7,8,9\}\)
Matlab
Po uruchomieniu matlaba bardzo często ekran (lub jego część) staje się nieczytelny? Co zrobić? Problem jest znany. Być może uruchomienie matlaba z parametrem1 –softwareopengl sprawę załatwi. (Sprawdzamy czy można coś zrobić ze sterownikami karty graficznej).Można poprośić aby standardowo matlab tak się uruchamiał wykonując w matlabie polecenie:1opengl('save','software')Przepraszamy za usterki.- Jak utworzyć macierz o wymiarach \(n\times m\), której zawartością są same zera? Służy do tego funkcja zeros:
1A = zeros(n, m)
- W jaki sposób wstrzymać wypisywanie zawartości wyników obliczeń (na przykład tablic) na ekranie? Na końcu polecenia należy umieścić średnik.
- W jaki sposób dodać element do tablicy?Matlab jest dosyć odporny na działania na tablicach. W szczególności można napisać tak:
123456789>> z=[1,2,3]z =1 2 3>> z(4,4)=7z =1 2 3 00 0 0 00 0 0 00 0 0 7
najpierw nadaliśmy wartości tablicy o jednym wierszu i trzech kolumnach, a następnie dodaliśmy element w czwartym wierszu i kolumnie — tablica została automatycznie rozbudowana.
Można też tak:
123456789>> for n=1:3d(n)=nendd =1d =1 2d =1 2 3albo tak:
12345678910e=[]>> for n=1:3e(end+1)=nende =1e =1 2e =1 2 3 - Jak wczytać dane i pozbyć się linii zawierających NaN?
- Ściągamy dane, na przykład plik
temperatura_29012017_0001.csv.xz
:
wget https://temisto.immt.pwr.wroc.pl/~myszka/Dane_Numeryczne/temperatura_29012017_0001.csv.xz - Rozpakowujemy
xz -d temperatura_29012017_0001.csv.xz
i dostajemy pliktemperatura_29012017_0001.csv
. - W pliku tym pierwszy wiersz to
--- AVERAGE 300
, kolejnych 288 wartości to pomiary (temperatury) z krokiem 300 sekund. Następnie (w lini 290) jest wiersz--- AVERAGE 1800
, w linii 627--- AVERAGE 86400
, a w linii 993 —--- AVERAGE 2678400
. - Od linii 1114 sytuacja zaczyna się powtarzać, ale teraz będą wartości minimalne (agregacja danych polega nie na uśrednianiu, ale na wyliczaniu minimum z pomiarów). Czyli
--- MIN 300
, 1800, 86400, 2678400. - Od linii 2227 są wartości maksymalne.
- Przetwarzanie najlepiej robić na pomiarach z doby (uśrednianie co 5 minut) lub tygodnia (uśrednianie co 30 minut).
- Plik można automatycznie ,,pociąć” na mniejsze kawałki używając dostępnego programu napisanego w awk. Pobieramy program:
wget http://kmim.wm.pwr.edu.pl/myszka/wp-content/uploads/sites/2/2015/10/cut.awk.
Uruchamiamygawk -f cut.awk temperatura_29012017_0001.csv
. W wyniku jego działania dostajemy pliki o nazwach:1234567891011AVERAGE300.datAVERAGE1800.datAVERAGE86400.datAVERAGE2678400.datMIN300.datMIN1800.datMIN86400.datMIN2678400.datMAX300.dat MAX1800.datMAX86400.datMAX2678400.dat - Dane zawierać mogą wartości NaN. W tym przypadku oznacza to, że w danej chwili nie udało się dokonać pomiarów. Ogólne znaczenie tego symbolu opisuje, na przykład, Wikipedia. Po zaimportowaniu danych trzeba się tych wierszy pozbyć. W opisywanym przypadku (plik
temperatura_29012017_0001.csv
) wartości NaN występują w pliku AVERAGE86400
grep NaN AVERAGE86400 | wc -l
Jest ich 15 sztuk. - Uruchamiamy Matlab i wczytujemy dane. Poprosiłem Matlaba o wygenerowanie skrypu dokonującego importu:
12345678910111213141516171819%% Import data from text file.% Script for importing data from the following text file:%% /home/myszka/przyklad/AVERAGE86400.dat%filename = '/home/myszka/przyklad/AVERAGE86400.dat';delimiter = ' ';fileID = fopen(filename,'r');formatSpec = '%f%f%[^\n\r]';dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'MultipleDelimsAsOne', true, 'EmptyValue' ,NaN, 'ReturnOnError', false);fclose(fileID);czas = dataArray{:, 1};temperatura = dataArray{:, 2};clearvars filename delimiter formatSpec fileID dataArray ans;
- Dalsze przetwarzanie jest dosyć proste. Trzeba znaleźć wszystkie te miejsca, w których pojawiają się NaNy (Dokumentacja Matlaba) (albo raczej te, w których NaNów nie ma):
nans = ~isnan(temperatura);
(nans to tablica zawierająca zera tam gdzie są NaNy i 1 w pozostałych miejscach). Selekcjonujemy dane:12Temperatura = temperatura(nans)Czas = czas(nans)Przy okazji sprawdźmy minimalną i maksymalną wartość zmierzonej temperatury:
max(Temperatura)
poda, że ta wartość to 3.8584e+04 amin(Temperatura)
to -100.8635 Jak widać dane zawierają błędy pomiarowe.find(Temperatura==min(Temperatura))
zwraca wartość 347 (to numer wiersza) aTemperatura(find(Temperatura==min(Temperatura))=[];
pozwala usunąć tę wartość. Ale lepiej robić to etapami (bo trzeba również usunąć odpowaidający jej znacznik czasowy)123i=find(Temperatura==min(Temperatura);Temperatura(i)=[];Czas(i)=[];. Podobnie z wartością maksymalną:
123i=find(Temperatura==max(Temperatura));Temperatura(i)=[];Czas(i)=[];Niestety, dane dalej zawierają błędy: max(T) wynosi 2.1329e+04 (ale min(T) to już sensowne -7.6313).
- Na koniec można zrobić wykres danych z miesiaca:
plot(Czas, Temperatura);
.Niestety, wykres nie jest piękny (zwłaszcza jeżeli chodzi o opis osi X ). Problemem jest format zapisu czasu. Matlab używa formatu POSIX.Unix timestamp na osi X Zależność między formatami jest następująca:
posixtime = unix_time/86400 + datenum(1970,1,1);
Teraz wykresplot(Czas / 86400 + datenum(1970, 1, 1), Temperatura)
i po zdefiniowaniu formatu osi Xdatetick('x','dd-mm-yy')
wygląda znacznie lepiej (rys. [temp2]).
- Ściągamy dane, na przykład plik
Jupyter/Python
- W jaki sposób zapisać otrzymany w Jupyterze wykres (czy ogólniej obrazek) wyświetlany inline?
- Najprościej tak jak w przeglądarce zapisuje się obrazki: klikamy prawym klawiszem myszy na obrazku i z menu wybieramy ,,Zapisz grafikę jako…”. Obrazek będzie w formacie PNG.
- Inna metoda to użycie funkcji
savefig()
tam gdzie (w przykładowych notatnikach) używana jest funkcjashow()
. Jako argument funkcjisavefig()
podajemy nazwę pliku. Na podstawie rozszerzenia system podejmie decyzję w jakim formacie wykres zapisać. Może to być png, svg, pdf, ps, eps.
- W jaki sposób zapisać tablicę danych numpy do pliku CSV?
Jeżeli nasza tablica z danymi nazywa się \(a\) to następujące polecanie zapiszą jako plik CSV.
12import numpynumpy.savetxt("foo.csv", a, delimiter=",")
Ogólne
- Czy do programowania należy wykorzystywać wyłącznie Matlab i/lub Mathematicę? Nie. Można użyć dowolnego języka programowania dostępne w laboratorium (C, C++, Python, Blockly,…). W miarę potrzeby (i dostępności) mogą zostać doinstalowane kolejne.
- W tym celu otwieramy terminal (naciskając równocześnie klawisze Ctrl-Alt-T i wpisujemy matlab –softwareopengl. Niestety, nie zawsze to działa.↩