W Matlabie można wiele działań na macierzach prowadzić bez użycia pętli - jak to pokazano w poprzednich ćwiczeniach - jednak uniwersalnym sposobem stosowanym we wszystkich językach programowania jest użycie podwójnej pętli.
Wówczas, przy generowaniu lub przetwarzaniu macierzy M posiadającej Lw wierszy i Lk kolumn, najczęściej stosujemy wybieranie poszczególnych elementów M(w,k) wiersza pierwszego a potem następnych, czyli indeksy wiersza w oraz kolumny k zmieniają się w sposób następujący:
dla w= 1, k=1, 2,...Lk;
dla w= 2, k=1, 2,...Lk;
. . . . . . . . . . .
dla w=Lw, k=1, 2,...Lk;
Jak widać pętla generująca wartości k musi być powtarzana tyle razy ile jest wierszy. Inaczej mówiąc petla zmieniająca numery kolumn k musi znaleźć się wewnątrz pętli zmieniającej numery wierszy w. W najprostszym przypadku może to wyglądać tak jak na rysunku poniżej:
Przykład 1:
Wygenerować macierz: |
Analiza problemu |
1 5 9 13 3 7 11 15 5 9 13 17 7 11 15 19 |
Jak widać w każdym wierszu macierzy:
Po za tym oczywiście wskaźniki zarówno wiersza jak i kolumny muszą przyjmować kolejne wartości w zakresie liczb naturalnych (w naszym przypadku: 1, 2, 3, 4). |
Zadanie można oczywiście rozwiązać na wiele sposobów, z których pokazano dwa:
PROGRAM 1 opiera się na koncepcji generowania kolejnych wartości indeksów wierszy i kolumn w i k tak jak to przedstawiono powyżej. Następnie wartości elementów macierzy a(w,k) są tworzone z wyrażeń wykorzystujących te indeksy w i k:
% PROGRAM 1 clear; for w=1:4 el=2*w-1; for k=1:4 a(w,k)=el; el=el+4; end end a, % wyświetli macierz |
PROGRAM 2 (zamieszczony poniżej) pokazuje Inną koncepcję generowania tej samej macierzy. Tutaj w pętli zewnętrznej generowane są wartości pierwszego elementu każdego wiersza (jako wartości zmiennej i), natomiast w pętli wewnętrznej - jako j - generowane są kolejne elementy wiersza zapoczątkowanego przez wartość i. Osobno - przy pomocy poleceń w=0, w=w+1 oraz k=0, k=k+1 umieszczonych w odpowiednich miejscach, generowane są indeksy elementów macierzy - które jak zawsze muszą przyjmować wartości kolejnych liczb naturalnych.
% PROGRAM 2 clear; w=0; for i=1:2:7 w=w+1; k=0; for j=i:4:i+3*4 k=k+1; a(w,k)=j; end end a |
Przykład 2:
Kolejny przykład pokazuje jak można wygenerować macierz trójkątną w której początkowe elementy wierszy są coraz mniejsze ale liczba niezerowych elementów rośnie.
W tym przypadku okazało się celowe zastosowanie innego typu pętli a mianowicie wewnętrzną pętlą jest pętla typu WHILE.
Wygenerować |
Przykładowy program: |
Wykres typu bar3(A) |
9 0 0 0 0 0 7 9 0 0 0 0 5 7 9 0 0 0 3 5 7 9 0 0 1 3 5 7 9 0 |
clear; % rezerwujemy pamięć % i zerujemy macierz: A(4,6) = 0; for w = 1:5 e = 11-2*w; k = 0; while e<10 k = k+1; A(w,k) = e; e = 2+e; end end A |
![]() |
Do wykresów trójwymiarowych - oprócz pokazanej już funkcji bar3(A) - służą takie funkcje jak: plot3, surf, surfc, mesh, meshc. Wykresy warstwicowe pozwala uzyskać funkcja contourf. Parametrami tych wykresów są prostokątne macierze X, Y, Z zawierające poszczególne zbiory współrzędnych punktów w przestrzeni 3D.
Do przekształcenia ciągu współrzędnych x oraz y na prostokatne macierze ich wszelkich kombinacji służy funkcja [X,Y]=meshgrid(x, y)
Na przykład jeśli mamy x:
>> x=4:7 x = 4 5 6 7 |
>> y=[22.5, 23.7, 37.2] y = 22.5000 23.7000 37.2000 |
>> [X,Y]=meshgrid(x,y); albo >> [X,Y]=meshgrid(4:7, [22.5, 23.7, 37.2]) X = 4 5 6 7 4 5 6 7 4 5 6 7 Y = 22.5000 22.5000 22.5000 22.5000 23.7000 23.7000 23.7000 23.7000 37.2000 37.2000 37.2000 37.2000 |
Funkcja meshgrid pozwala otrzymać wykres 3D bez użycia pętli:
clear; clc % najpierw MACIERZE punktów (X, Y) dla wykresu 3D: [X,Y]=meshgrid(-5:0.5:5, -5:0.5:5) % następnie definiujemy macierz Z: Z = 600 -X.*Y + 50*sin(X) + 50*sin(Y); % 1) wykres powierzchniowy: subplot(1,2,1); surfc(X,Y,Z); % 1)wykres warstwicowy: subplot(1,2,2); contourf(X,Y,Z); |
![]() |
Objaśnienia masz TUTAJ