1
Laboratorium komputerowe 6 Macierze – przykłady, zadania
1. Macierze – odwoływanie się do elementów, modyfikacje, wybrane funkcje.
1.1. Odwoływanie się do elementów macierzy.
Do elementów macierzy odwołujemy się podając numer wiersza i numer kolumny w nawiasach okrągłych. Przy czym możemy odwołać się albo do jednego elementu, albo do wielu elementów naraz (w szczególności do całego wiersza/całej kolumny czy wybranej podmacierzy).
W drugim przypadku można wykorzystać operator zakresu :, albo zapis wektorowy [], pozwalający zdefiniować wektory indeksów wierszy i kolumn. Indeksy wierszy/kolumn są liczbami naturalnymi od 1 do end.
Dla przypomnienia, operator zakresu używamy w następujący sposób:
początek : przyrost : koniec
Przy czym przyrost możemy pominąć i wówczas jego wartość domyślnie wynosi 1. Jeśli dodatkowo pominiemy początek oraz koniec i pozostawimy tylko sam operator :, wówczas odwołujemy się do całego zakresu (cały wiersz lub cała kolumna).
Przykład
Zdefiniujmy macierz
𝐴 = [
−2 0.5 −3 0.7 3 2
1.2 3.5 2.3 2.9 0.7 −1 0.2 3.1 5 −4 −1.4 2
]
A(1,3) % pierwszy wiersz, trzecia kolumna wynik: -3
A(2,end) % drugi wiersz, ostatnia kolumna wynik: -1
A(3,2:5) % trzeci wiersz, kolumny od drugiej
% do piątej wynik: [3.1 5 -4 -1.4]
A(3,1:2:end) % wiersz trzeci, kolumny nieparzyste wynik: [0.2 5 -1.4]
2
A(2,:) % drugi wiersz
wynik: [1.2 3.5 2.3 2.9 0.7 -1]
A(:,1) % pierwsza kolumna
wynik: -2 1.2 0.2
A(1,[1 6]) % wiersz pierwszy, kolumny: pierwsza
% i szósta wynik: [-2 2]
A([1,3],2) % wiersze: pierwszy i trzeci, kolumna druga wynik: 0.5
3.1
A([2,3],[1,end]) % wiersze: drugi i trzeci, kolumny:
% pierwsza i ostatnia wynik: 1.2 -1
0.2 2
Analogicznie możemy odwoływać się do elementu bądź elementów wektorów (wektor jest po prostu szczególnym typem macierzy).
1.2. Modyfikacje macierze – wstawianie, usuwanie, modyfikowanie wierszy i kolumn Przykład
Zdefiniujmy macierz i wektory:
A = [
2 −3 −1
4 1 2
7 −4 3
] 𝐚 = [ 1 2 3
] 𝐛 = [
−2
−3 1
] 𝐚 = [2 1 4 −1 3]
Wstawienie dodatkowej kolumny do macierzy:
A = [A a] % wstawienie dodatkowej kolumny po ostatniej
% kolumnie macierzy A
A = [a A] % wstawienie dodatkowej kolumny przed
% pierwszą kolumną macierzy A A = [A(:,1) b A(:,2:end)]
% wstawienie dodatkowej kolumny pomiędzy
% pierwszą i drugą kolumną macierzy A
3
Po wykonaniu trzech powyższych operacji uzyskujemy macierz:
A = [
1 −2 2 −3 −1 1
2 −3 4 1 2 2
3 1 7 −4 3 3
]
Usunięcie kolumny:
A(:,1) = [] % usunięcie pierwszej kolumny macierzy wynik:
A = [
−2 2 −3 −1 1
−3 4 1 2 2
1 7 −4 3 3
]
Modyfikacja kolumny:
A(:,5) = [1;1;1]
% zdefiniowanie piątej kolumny od nowa wynik:
A = [
−2 2 −3 −1 1
−3 4 1 2 1
1 7 −4 3 1
]
A(:,2) = 2*A(:,2) + A(:,5)
% pomnożenie drugiej kolumny przez dwa
% i dodanie do niej kolumny piątej wynik:
A = [
−2 5 −3 −1 1
−3 9 1 2 1
1 15 −4 3 1
]
A(:,1) = 0 % wyzerowanie pierwszej kolumny wynik:
A = [
0 5 −3 −1 1
0 9 1 2 1
0 15 −4 3 1
]
Wstawienie dodatkowego wiersza do macierzy:
A = [A; c] % wstawienie dodatkowego wiersza
% po ostatnim wierszu macierzy A wynik:
A = [
0 5 −3 −1 1
0 9 1 2 1
0 15 −4 3 1
2 1 4 −1 3
]
4
Usuwanie i modyfikowanie wierszy macierzy wykonywane jest analogicznie do usuwania i modyfikowania kolumn.
1.3. Sprawdzenie działania wybranych funkcji dla wektorów i macierzy.
max(), min(), mean()
dla wektorów: funkcja zwraca odpowiednio największy, najmniejszy, średni element;
dla macierzy: funkcja zwraca odpowiednio największy, najmniejszy, średni element w każdej kolumnie macierzy (w wyniku otrzymujemy wektor wartości największych, najmniejszych, średnich)
sort()
analogicznie jak powyżej, funkcja sortuje wektor lub każdą kolumnę macierzy sortrows()
funkcja sortuje macierz względem podanej kolumny Przykład
𝑎 = [−4 5 1 −3 7 1]
min(a)
wynik: -4 max(a)
wynik: 7 mean(a)
wynik: 1.1667
sort(a) %lub: sort(a, ’ascend’) wynik: [-4 -3 1 1 5 7]
sort(a, ’descend’)
wynik: [7 5 1 1 -3 -4]
𝐴 = [
3 1 3 −3 3
−1 6 3 −7 2
2 1 5 1 5
0 −5 2 1 2
7 2 1 4 1]
min(A)
wynik: [-1 -5 1 -7 1]
max(A)
wynik: [7 6 5 4 5]
5 mean(A)
wynik: [2.2 1.0 2.8 -0.8 2.6]
sort(A) %lub: sort(A, 1)
wynik:
[
−1 −5 1 −7 1
0 1 2 −3 2
2 1 3 1 2
3 2 3 1 3
7 6 5 4 5]
sort(A, 2) %sortowanie każdego wiersza macierzy wynik:
[
−3 1 3 3 3
−7 −1 2 3 6
1 1 2 5 5
−5 0 1 2 2
1 1 2 4 7]
%alternatywnie sortowanie każdego wiersza możemy uzyskać:
sort(A’)’
sortrows(A, 1) %sortowanie wierszy względem pierwszej
%kolumny wynik:
[
−1 6 3 −7 2
0 −5 2 1 2
2 1 5 1 5
3 1 3 −3 3
7 2 1 4 1]
sortrows(A, 3) %sortowanie wierszy względem trzeciej
%kolumny wynik:
[
7 2 1 4 1
0 −5 2 1 2
3 1 3 −3 3
−1 6 3 −7 2
2 1 5 1 5]
1.4. Funkcje generujące szczególne typy macierzy.
ones(n,m)
funkcja tworzy macierz o rozmiarach n x m wypełnioną jedynkami (w przypadku podania jednego argumentu zostanie utworzona macierz kwadratowa)
zeros(n,m)
funkcja tworzy macierz wypełnioną zerami
6 eye(n)
funkcja tworzy macierz jednostkową diag([2 1 3 -1 4])
funkcja tworzy macierz diagonalną – na przekątnej zostaną wstawione po kolei elementy z wektora podanego jako argument funkcji
rand(n,m)
funkcja tworzy macierz wypełnioną liczbami pseudolosowymi z przedziału (0, 1)
2. Zadania Przykład 1
Zdefiniować poniższą macierz i wektor:
A = [
−7 2 3.1 4
1 3 0.5 1
1.9 1.2 0 −3
2 0 −1 0.5
] 𝐚 = [
−𝟏 𝟑 𝟏
−𝟏 ]
Wykonać na macierzy A następujące operacje (z zachowaniem kolejności):
- wstawić wektor 𝐚 pomiędzy drugą i trzecią kolumnę macierzy A , - usunąć pierwszą kolumnę macierzy A ,
- zamienić miejscami pierwszy i ostatni wiersz macierzy A ,
- do wiersza drugiego dodać wiersz pierwszy pomnożony przez 0.5 ,
- utworzyć macierz B złożoną z drugiego i ostatniego wiersza oraz pierwszej i ostatniej kolumny macierzy A .
Obliczyć ślad macierzy B (ślad macierzy to suma elementów na przekątnej – można skorzystać z funkcji trace).
Rozwiązanie:
clear clc
A = [-7 2 3.1 4; 1 3 0.5 1; 1.9 1.2 0 -3; 2 0 -1 0.5]
a = [-1; 3; 1; -1]
A = [A(:,1:2) a A(:,3:end)]
A(:,1) = []
tmp = A(1,:);
A(1,:) = A(end,:);
A(end,:) = tmp
7 A(2,:) = A(2,:) + 0.5*A(1,:) B = A([2 end],[1 end])
wynik = trace(B)
Wynik: 7
Przykład 2
Napisać funkcję, która dla dowolnej macierzy 𝐴𝑛 × 𝑚 obliczy:
√∑ ∑ 𝐴2𝑖,𝑗
𝑚
𝑗=1 𝑛
𝑖=1
Wykonać powyższe zadanie na dwa sposoby:
a) Za pomocą pętli for.
b) Za pomocą funkcji sum().
Rozwiązanie:
a)
function s = normamacierzy1(A)
[n,m] = size(A); % odczytujemy rozmiar macierzy s = 0;
for i = 1:n % przechodzimy po wszystkich wierszach for j = 1:m % i dla każdego wiersza po
% wszystkich kolumnach macierzy
s = s + A(i,j)*A(i,j);
end end
s = sqrt(s);
end
8 b)
function s = normamacierzy2(A) s = sqrt(sum(sum(A.*A)));
end
Uwaga:
Sprawdzić obydwie funkcje dla tej samej macierzy. Przykładowo, zdefiniować w Command Window dowolną macierz i wywołać dla niej obydwie funkcje. Powinno się uzyskać taki sam wynik.
A=[3 1 2 3; 1 -2 -3 1; 2 1 0 1]
normamacierzy1(A) normamacierzy2(A) wynik: 6.6332
Zadania do samodzielnego wykonania zad. 1.
Utworzyć macierz wypełnioną liczbami pseudolosowymi całkowitymi z przedziału (−5, 10).
Obliczyć sumę i udział procentowy liczb dodatnich w danej macierzy.
Uwaga: można skorzystać z funkcji rand() oraz round().
zad. 2.
Napisać funkcję, która porównuje odpowiadające sobie elementy dwóch macierzy o tych samych rozmiarach: 𝐴𝑛 × 𝑚 oraz 𝐵𝑛 × 𝑚. W wyniku funkcja ma zwracać ile elementów 𝐴𝑖,𝑗 jest większych od odpowiadających im elementów 𝐵𝑖,𝑗. Funkcja powinna sprawdzać czy obydwie macierze mają taki sam rozmiar i wykonywać porównania tylko w takim przypadku.
zad. 3.
Napisać funkcję, która sprawdza czy podana macierz jest macierzą kwadratową, a następnie zlicza, ile jej elementów jest podzielnych przez 2. Jeśli macierz nie jest kwadratowa funkcja ma tylko wyświetlić stosowny komunikat.
Uwaga: skorzystać z funkcji mod(a,b), która zwraca resztę z dzielenia liczby a przez b.