OBJAŚNIENIA do Laboratorium 5 z Matlaba

5.1. Programy z podwójną pętlą

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:

  • pierwszy element jest kolejną liczbą nieparzystą
  • każdy następny element jest większy o 4 od poprzedniego

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ć
macierz A:

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


5.2. Wykresy 3D

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
oraz y:
>> y=[22.5, 23.7, 37.2]

y =
   22.5000   23.7000   37.2000
to funkcja meshgrid utworzy z nich macierze X,Y:
>> [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);

5.3. Funkcje użytkownika

Objaśnienia masz TUTAJ


^ Powrót do spisu