Przekształcanie macierzy
Na dane związane z budownictwem mieszkaniowym, które służą nam jako baza do zapoznania się z MATLABem, można patrzeć naprawdę w różny sposób. Wierzę, że jeśli chcesz poeksperymentować i wyciągnąć z pliku interesujące Cię informacje, to jesteś już w stanie zrobić to sam. Niemniej jednak chciałem zademonstrować Ci działanie kolejnej funkcji MATLABa, która przy wstępnej pracy z danymi macierzowymi może się przydać.
Przypuśćmy, że chcemy zaobserwować, jak z miesiąca na miesiąc zmieniała się ogólna liczba oddanych do użytku mieszkań, począwszy od roku 1991 a kończąc na roku 2011. Możemy oczywiście wybierać poszczególne wektory dla poszczególnych lat i sklejać je potem w całość ale możemy też zrobić to sprytniej. W pierwszej kolejności wybierzmy z macierzy BMdaneM tylko te dane opisane jako „OGÓŁEM”. Operacja sprowadza się do wybrania co szóstego wiesza, począwszy od wiersza drugiego a kończąc na wierszu 122.
- W oknie poleceń MATLABa wpisz:
load bud ogolemM = BMdaneM(2:6:122,:);
Mamy teraz w przestrzeni roboczej macierz ogolemM, w której dane o oddanych do użytku mieszkaniach rozmieszczone są na zasadzie: kolejny wiersz to kolejny rok, kolejna kolumna to kolejny miesiąc.
My chcemy umieścić te dane w jednym wierszu, by można je było następnie wyświetlić na wykresie. W tym celu posłużymy się funkcją reshape
, która potrafi ułożyć elementy macierzy w nowy sposób. Zanim uruchomimy funkcję na macierzy BMdaneM warto zrozumieć, jak ta funkcja działa.
- Przećwicz działanie funkcji
reshape
na macierzy o rozmiarach 3x3
A = [1 2 3; 4 5 6; 7 8 9] reshape(A, 1, 9)
A =
1 2 3
4 5 6
7 8 9
ans =
1 4 7 2 5 8 3 6 9
Jak się można domyślić, funkcja reshape
jako argumenty wejściowe przyjmuje macierz, nad której kształtem pracujemy oraz wymiary, jakie ma otrzymać macierz wynikowa. Chociaż wymiary są odpowiednie (1 wiersz, 9 kolumn), wynikowa macierz nie została poskładana tak, jakbyśmy sobie tego życzyli. MATLAB, zgodnie z ogólną filozofią działania poskładał nową macierz „idąc po kolumnach”, a my chcielibyśmy posklejać macierz „po wierszach”. Aby osiągnąć zamierzony efekt, wystarczy przed uruchomieniem funkcji reshape transponować macierz.
A = A' reshape(A,1,9)
ans =
1 2 3 4 5 6 7 8 9
O taki efekt nam chodziło.
Powróćmy do naszej macierzy ogolemM. Macierz ma wymiary 21 wierszy na 12 kolumn, a my chcemy przekształcić ją w wektor, który zawierałby 252 elementy. Ta wartość może zostać podana jako jeden z argumentów wejściowych funkcji reshape
ale, co ciekawe, nie musi. W końcu jeśli decydujemy się na stworzenie jednego wiersza, to liczba kolumn w wynikowej macierzy jest automatycznie determinowana. Pouczeni powyższym przykładem możemy wykonać operacje:
ogolemW = reshape(ogolemM',1,252); ogolemW = reshape(ogolemM',1, []); % obie wersję dają ten sam wynik
Możesz teraz stworzyć wykres.
plot(ogolemW); xlabel('miesiące (od stycznia 1991)'); ylabel('liczba oddanych mieszkań'); title('mieszkania "OGÓŁEM"');
Z wykresu wynika, że najwięcej mieszkań do użytku oddawanych jest w grudniu – na wykresie rzuca się jeszcze w oczy wyjątkowy miesiąc 151 (czyli lipiec roku 2003). To jednak nie są informacje dane nam wprost, na osi x wykresu są przecież jedynie kolejne numery, a to, na który miesiąc (i rok) wskazuje dany numer trzeba sobie przeliczyć.
Daty w MATLABie
Właśnie ze względu na pewne kłopoty wynikające z umieszczania danych kalendarzowych na wykresach w MATLABie (jak i w innych językach programowania) wprowadzony specjalny typy danych do przechowywania informacji o czasie. W MATLABie są to datetime
, duration
oraz calendardutaion
.
Stworzymy zatem wektor czasu do umieszczenia na wykresie. Jak w przypadku każdego wektora tworzonego w MATLAB potrzebne nam będą: punkt startowy, punkt końcowy i krok.
- W oknie poleceń MATLABa wpisz:
t1 = datetime(1991,1,31) t2 = datetime(2011,12,31) dt = calendarDuration(0,1,0) t = t1:dt:t2;
Punkt t1 to 31 stycznia 1991 roku, t2 to 31 grudnia 2011r. Określony krok dt wynosi jeden miesiąc (liczba lat i dni to 0 ).
Teraz, gdy wszystko jest gotowe pozostało stworzenie wykresu.
- Wykorzystaj utworzone wektory do wygenerowania wykresu.
plot(t, ogolemW); xlabel('czas'); ylabel('liczba oddanych mieszkań'); title('mieszkania "OGÓŁEM"'); grid on
Daty mogą sprawić sporo kłopotów, zwłaszcza podczas importu danych. Nie trzeba się jednak zrażać, analiza kilku przykładów zawartych w dokumentacji pod hasłem datetime
powinna pomóc.