Matlab Tutorial #5

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.

macierz danych

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"');

wykres - mieszkania ogolem

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 datetimeduration 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

mieszkania, czas vs. liczba

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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *