Meshgrid

Meshgrid

Meshgrid - sympatyczna funkcja w MATLABie, której działanie w pierwszym momencie może wydawać się nieco tajemnicze. W tej chwili mogę sobie wyobrazić zagubionego użytkownika programu MATLAB, który zaplątał się podczas czytania dokumentacji i gdzieś tam przez przypadek trafił na opis funkcji meshgrid. Czyta, myśli sobie "fajne, ale po co". Zaintrygowany siada przed komputerem, wpisuje w wyszukiwarkę "Meshgrid MATLAB po co" i trafia na tę właśnie stronę. Niemożliwe? Powiedzmy, że mało prawdopodobne. Dla mnie ważne, że jeśli się ktoś taki trafi, to mogę mu pomóc. W zasadzie jeśli się ktoś taki trafi, to mogłem mu pomóc, bo wpis już przecież jest gotowy.

Poza świat 2d

Funkcje jednej zmiennej to oczywiście nasza codzienność. Od święta zdarzają się jednak sytuacje, że trzeba coś uzależnić od dodatkowej zmiennej. Jak się do tego prawidłowo zabrać? Przeanalizujmy to na prostym przykładzie. Powiedzmy, że ktoś nam zlecił stworzenie w MATLABie wykresu funkcji

f(x,y) = \frac{\sin(x)\cos(y)}{x^2 + y^2 + 1} \enspace x,y \in <-5,5>

No, nie wydaje się to jakieś super skomplikowane. Na początek należy oczywiście stworzyć wektory x i y, wyznaczyć na ich podstawie z i wyświetlić wynik na wykresie.

x = linspace(-5,5);
y = x;
z = (sin(x).*cos(y)) ./ (x.^2 + y.^2 + 1);
plot3(x, y, z);

Nie da się ukryć, że wykres wygląda dosyć płaskawo. Nie o to przecież chodziło. Co się w ogóle stało? MATLAB zadziałał prawidłowo, dla wektorów x i y wyznaczył wektor z. Nie ma się co dziwić, że wykres, mimo że niby 3d, wygląda jak wygląda. Co należałoby zrobić? Na podstawie posiadanego wzoru wyznaczyć z dla wszystkich możliwych kombinacji x i y. W pierwszej chwili kuszące może się wydawać skorzystanie z pętli for ...

z = zeros(length(x));
for i=1:length(x)
for j = 1:length(y)
z(j, i) = (sin(x(i))*cos(y(j))) / (x(i)^2 + y(j)^2 + 1);
end
end
plot3(x, y, z);


Wykres wygląda o wiele bardziej optymistycznie, jest na nim teraz naprawdę dużo kolorków. Nie da się ukryć, że coś tu dalej nie gra 🙂 Znowu nie ma powodu by winić o cokolwiek MATLABa. Funkcja plot3 przyjmuje jako argument wektory danych i dla każdych dwóch elementów z wektorów x i y wyświetla jeden element z wektora z. W powyższym przypadku z jest macierzą, więc funkcja wyświetla osobnymi kolorami wszystkie elementy znalezione w kolejnych kolumnach macierzy z. Rozwiązaniem mogłoby być przygotowanie wektorów x i y tak, aby na wykresie uzyskać wszystkie kombinacje. To nie byłby najlepszy pomysł, gdyż istnieje funkcja surf.

surf(x, y, z)
Ale to nie koniec...

To jednak nie koniec. W zasadzie to mógłby być koniec, ale wpis miał być o funkcji meshgrid, a do tej pory nic o niej nie było. Zatem jeszcze kilka ostatnich zdań.
Za każdym razem, gdy w MATLABIe pojawia się zagnieżdżona pętla for, należy się chwilę zastanowić, czy przypadkiem nie istnieje inne, lepsze rozwiązanie problemu. W tym wypadku istnieje i jest nim funkcja meshgrid. Funkcja meshgrid tworzy dla nas wszystkie możliwe kombinacje "punktów" dla wektorów pojawiających się na jej wejściu. Funkcja otrzymuje wektory a zwraca macierze, co jest w zasadzie bardzo praktyczne. Można dzięki temu powyższą zagnieżdżoną pętlę for zastąpić dwiema liniami kodu:

[X, Y] = meshgrid(x, y);
Z = (sin(X).*cos(Y))./(X.^2 + Y.^2 + 1);
surf(X, Y, Z); % ok, są tu 3 linie kodu, ale ta ostania to wykres

Wygląda to dużo lepiej.
Gdyby ktoś się uparł, żeby wykres stworzyć przy pomocy funkcji plot3, to w sumie można.

plot3(X(:), Y(:), Z(:))

(Visited 311 times, 1 visits today)

Dodaj komentarz

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