Operator | Opis | Operator | Opis |
---|---|---|---|
A + B | dodawanie | A .+ B | dodawanie |
A - B | odejmowanie | A .- B | odejmowanie |
A * B | iloczyn macierzy | A .* B | mnożenie elementów |
A / B | dzielenie macierzy $A B^{-1}$ (a właściwie $(B^T/A^T)^T)$ | A ./ B | dzielenie elementów |
A \ B | dzielenie macierzy $A^{-1}B $ (rozwiązanie $Ax=B$) | A .\ B | dzielenie elementów |
A' | transpozycja (sprzężona) | A.' transpozycja | |
A ^ n | potęgowanie macierzy (A * A * ... * A ) | A.^B | potęgowanie elementami |
Funkcja | Opis |
---|---|
zeros(N, M) | macierz zerowa |
ones(N, M) | macierz z jedynkami |
eye(N, M) | macierz tożsamościowa z 1 na diagonali |
rand(N, M) | macierz z wartościami losowymi z rozkładu jednostajnego $[0,1]$ |
randn(N, M) | macierz z wartościami losowymi z rozkładu normalnego $N(0,1)$ |
linspace(A, B, K) | wektor $K$ puntów na odcinku $[A,B]$ |
magic(N) | macierz liczb całkowitych o identycznej sumie w wierszach i kolumnach |
Funkcja | Opis |
---|---|
reshape(A, N, M) | zmiana wymiarów macierzy |
length(A) | ilość elementów wektora lub najdłuższy wymiar macierzy |
size(A) | ilość wierszy i kolumn macierzy |
numel(A) | ilość elementów |
trace(A) | ślad macierzy |
det(A) | wyznacznik macierzy |
rank(A) | rząd macierzy |
inv(A) | odwrócenie macierzy $A^{-1}$ |
Ćwiczenie Rozwiąż układ równań $Ax=b$ $$
\left\{\begin{array}{l}
x+2 y+3 z=1 \\
4 x+5 y+6 z=1 \\
7 x+8 y \quad=1
\end{array}\right.
$$ 1. rozwiązując równanie $x = A^{-1}b$
2. za pomocą operatora \
A = [1 2 3 ; 4 5 6; 7 8 0] b = [1 ; 1; 1] x = inv(A) * b x1 = A \ b A * x1
A = 1 2 3 4 5 6 7 8 0 b = 1 1 1 x = -1.0000e+00 1.0000e+00 -4.1633e-17 x1 = -1.0000e+00 1.0000e+00 -3.7007e-17 ans = 1.00000 1.00000 1.00000
Wiele funkcji Matlaba $f(x)=y$ jest przystosowana do działania na macierzach o dowolnych kształtach
X = reshape(1:24, 4, 6) a = sin(X) b = 5 * cos(X) .* sin(a) + exp(X)
X = 1 5 9 13 17 21 2 6 10 14 18 22 3 7 11 15 19 23 4 8 12 16 20 24 a = 0.8414710 -0.9589243 0.4121185 0.4201670 -0.9613975 0.8366556 0.9092974 -0.2794155 -0.5440211 0.9906074 -0.7509872 -0.0088513 0.1411200 0.6569866 -0.9999902 0.6502878 0.1498772 -0.8462204 -0.7568025 0.9893582 -0.5365729 -0.2879033 0.9129453 -0.9055784 b = Columns 1 through 4: 4.73259 147.25217 8101.25916 442415.24281 5.74721 402.10475 22028.63723 1202604.85597 19.38931 1098.93533 59874.12309 3269015.07284 56.84211 2980.35003 162752.63456 8886111.88011 Columns 5 and 6: 24154953.88173 1318815732.45003 65659966.88446 3584912846.17585 178482301.70134 9744803448.24378 485165197.02438 26489122128.17479
type pole_kola2.m x = rand(3, 4) y = pole_kola2(x) + x
pole_kola2.m is the user-defined function defined from: /home/marek/work/zajecia/2020.zimowy/pp2/github/pole_kola2.m function pole = pole_kola2(r) % Skrypt wyznacza pole koła o promieniu r pole = pi * r.^2; end x = 0.388627 0.326921 0.739871 0.325203 0.666370 0.695561 0.803623 0.548489 0.022186 0.087533 0.405026 0.796218 y = 0.863104 0.662685 2.459609 0.657449 2.061393 2.215480 2.832493 1.493604 0.023732 0.111604 0.920391 2.787873
Ćwiczenie popraw program pole_kola.m
tak aby funkcja zwracała poprawny wynik dla argumentu macierzowego. Wynikiem funkcji będzie macierz zawierająca w każdym z elementów $P_{ij}$ wartość pola dla promienia $R_{ij}$. Postaraj się nie korzystać z instrukcji pętli.
Ćwiczenie zmierz czas wykonywania poniższych instrukcji.
x
n=100000 x = []; tic for i=1:n x(i) = sqrt(i); end toc sum(x) x = zeros(1, n); tic for i=1:n x(i) = sqrt(i); end toc sum(x) tic x = sqrt([1:n]); toc sum(x)
n = 100000 Elapsed time is 0.445198 seconds. ans = 21082008.97392 Elapsed time is 0.412186 seconds. ans = 21082008.97392 Elapsed time is 0.00226307 seconds. ans = 21082008.97392
logical
), wartość 0
to fałsz, wartość 1
(lub niezerowa) to prawdafalse()
i true()
pozwalają tworzyć macierze logicznelogical()
zamienia macierz liczbową na logicznąX = [1 , -5, 7 ; -1, 42, -12] ind = X < 0 whos X ind
X = 1 -5 7 -1 42 -12 ind = 0 1 0 1 0 1 Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== X 2x3 48 double ind 2x3 6 logical Total is 12 elements using 54 bytes
-12# indeksowanie macierzą logiczną a = X(ind) b = X( X > 0 ) X( X > 0 ) = 102
ans = -12 a = -1 -5 -12 b = 1 42 7 X = 102 -5 102 -1 102 -12
A = true(2) B = false(2, 3) whos A B
A = 1 1 1 1 B = 0 0 0 0 0 0 Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== A 2x2 4 logical B 2x3 6 logical Total is 10 elements using 10 bytes
# wartości logiczne mogą być traktowane jak liczby całkowite A = false(2) C = A + 1 whos A C
A = 0 0 0 0 C = 1 1 1 1 Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== A 2x2 4 logical C 2x2 32 double Total is 8 elements using 36 bytes
Ćwiczenie dlaczego poniższe wyrażenie nie działa? Spróbuj to naprawić.
w = 1:5 w([1 0 1 0 1] == 1 ) = 0
w = 1 2 3 4 5 w = 0 2 0 4 0
Funkcja | Opis |
---|---|
any() | zwraca 1 gdy wektor posiada niezerowy element |
dla macierzy zwraca wektor z wartością 1 gdy w kolumnie jest niezerowa wartość | |
all() | zwraca 1 dla każdej kolumny której wszystkie elementy są niezerowe |
find() | zwraca indeksy (indeksowanie liniowe) niezerowych elementów |
isequal() | sprawdza czy macierze mają jednakowe elementy |
isnan() | sprawdza czy w macierzy są elementy NaN |
w1 = [ 0 0 1 2 ]; w2 = zeros(1,10); a = all(w1) b = any(w1) c = all(w2) d = any(w2)
a = 0 b = 1 c = 0 d = 0
E = [ 1 2 ; 0 0 ; 3 * eye(2)]' all(E) any(E)
E = 1 0 3 0 2 0 0 3 ans = 1 0 0 0 ans = 1 0 1 1
E # indeksy liniowe k = find(E) a = E(k)
E = 1 0 3 0 2 0 0 3 k = 1 2 5 8 a = 1 2 3 3
E # indeksy wierszy i kolumn [w k] = find(E)
E = 1 0 3 0 2 0 0 3 w = 1 2 1 2 k = 1 1 3 4
# szukanie zerowych elementów k2 = find(~E)
k2 = 3 4 6 7
# szukanie elementów spełniających określone warunki k3 = find(E > 2)
k3 = 5 8
X = E isequal(E, X)
X = 1 0 3 0 2 0 0 3 ans = 1
% to samo za pomocą funkcji all() all(all(X == E))
ans = 1
X(1,1) = 13 isequal(E, X) all(all(X == E)) ~any(any(X ~= E))
X = 13 0 3 0 2 0 0 3 ans = 0 ans = 0 ans = 0
Operator | Opis |
---|---|
A < B | mniejszy niż |
A > B | większy niż |
A <= B | mniejszy lub równy |
A >= B | większy lub równy |
A == B | równy sobie |
A ~= B | rożny od siebie |
A & B | operator AND elementami |
A \| B | operator OR elementami |
~A | Operator NOT |
X = magic(5) a = X(X > 5 & X < 10)
X = 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 a = 6 7 8 9
parzyste = X(mod(X, 2) == 0)
parzyste = 4 10 24 6 12 18 8 14 20 2 16 22
c = X(~mod(X, 2) == 0 | X < 5)
c = 17 23 4 11 5 1 7 13 19 25 21 2 15 3 9
Ćwiczenie utwórz macierz X
o wymiarach 10×10 posiadającą losowe wartości z rozkłady normalnego $N(0, 1)$
X
liczbą 0
X = randn(10, 10); X( X < 0) = 0; sum(X(X > 0.5)) sum(X(find(X > 0.5)))
ans = 33.202 ans = 33.202
Funkcja | Opis |
---|---|
min | minimum (w kolumnach) |
max | maksimum (w kolumnach) |
mean | wartość średnia |
std | odchylenie standardowe |
median | mediana |
mode | wartość modalna (dominanta) |
var | wariancja |
kurtosis | kurtoza |
skewnes | skośność |
sort | sortowanie |
X = randn(3,5) a = min(X) z = min(min(X))
X = -0.98080 -1.33877 -0.75984 -1.10188 -1.06108 -1.38270 1.19402 -0.73617 -0.39035 -1.23597 0.48693 -0.11938 0.29326 0.48180 1.14709 a = -1.38270 -1.33877 -0.75984 -1.10188 -1.23597 z = -1.3827
% drugi argument wyjściowy to indeksy [a ind]= min(X) printf('Min. wartość w kolumnie 2 to %f\n', X(ind(2), 2))
a = -1.38270 -1.33877 -0.75984 -1.10188 -1.23597 ind = 2 1 1 1 2 Min. wartość w kolumnie 2 to -1.338766
% minimim w wierszach b = min(X, [], 2)
b = -1.33877 -1.38270 -0.11938
% minimim parami elementów c = min(X, zeros(size(X)))
c = -0.98080 -1.33877 -0.75984 -1.10188 -1.06108 -1.38270 0.00000 -0.73617 -0.39035 -1.23597 0.00000 -0.11938 0.00000 0.00000 0.00000
X = randn(3,5) % średnia wartośc w kolumnach a = mean(X) # średnia w wierszach b = mean(X, 2) # średnia ze wszystkich wartości macierzy c = mean(X(:))
X = 0.152208 -0.153149 -0.337226 -0.065059 -0.777124 0.601924 0.966119 -0.381971 0.475464 1.277699 -0.696218 0.879928 0.179555 1.982327 -1.291726 a = 0.019305 0.564299 -0.179881 0.797577 -0.263717 b = -0.23607 0.58785 0.21077 c = 0.18752
# odchylenie standardowe s = std(X) # wariancja v = var(X) s2 = sqrt(v) # sdt = sqrt(var)
s = 0.65920 0.62282 0.31208 1.06102 1.35948 v = 0.434541 0.387907 0.097396 1.125765 1.848176 s2 = 0.65920 0.62282 0.31208 1.06102 1.35948
X = randi(10, 5, 3) d = median(X)
X = 5 4 6 8 6 6 2 7 8 7 6 8 3 4 5 d = 5 6 6
# mediana to środkowa wartość po posortowaniu a = sort(X)
a = 2 4 5 3 4 6 5 6 6 7 6 8 8 7 8
X = randi(3, 5, 3) # wartość domunująca e = mode(X)
X = 2 1 2 1 2 2 1 2 2 3 2 1 3 1 1 e = 1 2 2
Ćwiczenie wczytaj dane carsmall
i wykonaj następujące operacje:
NaN
)MPG
i wyznacz jej wartość średnią, odchylenie i medianęMPG
dla samochodów z roku 82 (Model_year
)Cylinders
(zob. funkcję unique()
)Acceleration
W Matlabie dane można wczytać polecaniem load carsmall
.
Jeżeli zbiór danych nie jest dostępny (np. w Octave) to pobierz go stąd: https://www.fizyka.umk.pl/~grochu/pp2/carsmall.mat
plot(x,y)
liniowy (wykres rozrzutu)hist(x)
histogramboxplot(x)
skrzynkowybar(x)
słupkowypie(x)
kołowyclear load carsmall whos % plik z danymi (dla Octave) https://www.fizyka.umk.pl/~grochu/pp2/carsmall.mat
Variables in the current scope: Attr Name Size Bytes Class ==== ==== ==== ===== ===== Acceleration 100x1 800 double Cylinders 100x1 800 double Displacement 100x1 800 double Horsepower 100x1 800 double MPG 100x1 800 double Mfg 100x13 1300 char Model 100x33 3300 char Model_Year 100x1 800 double Origin 100x7 700 char Weight 100x1 800 double Total is 6000 elements using 10900 bytes
hist(MPG)
boxplot(MPG); % uwaga: w octave może być wymagane odinstalowanie pakietu statystycznego % pkg load statistics
warning: the 'boxplot' function belongs to the statistics package from Octave Forge which you have installed but not loaded. To load the package, run 'pkg load statistics' from the Octave prompt. Please read <https://www.octave.org/missing.html> to learn how you can contribute missing functionality. error: 'boxplot' undefined near line 1 column 1
% wykres Acceleration w grupach utworzonych przez Model_Year boxplot(Acceleration, Model_Year);
warning: the 'boxplot' function belongs to the statistics package from Octave Forge which you have installed but not loaded. To load the package, run 'pkg load statistics' from the Octave prompt. Please read <https://www.octave.org/missing.html> to learn how you can contribute missing functionality. error: 'boxplot' undefined near line 2 column 1
plot(Acceleration, Horsepower, 'o')
## Wykres rozrzutu w grupach
unique(Cylinders)
ans = 4 6 8
plot(Acceleration(Cylinders == 4), Horsepower(Cylinders==4), 'o') hold on % zachowanie wykresu, kolejna funkcja plot() doda punty na aktyalny wykres plot(Acceleration(Cylinders == 6), Horsepower(Cylinders==6), 'x') plot(Acceleration(Cylinders == 8), Horsepower(Cylinders==8), 's')
Ćwiczenie wygeneruj wektor zawierający 1000 wartości z rozkładu normalnego o średniej 5 i odchyleniu standardowym 10.
histfit()
bar([sum(Cylinders == 4) sum(Cylinders == 6) sum(Cylinders == 8)])
pie([sum(Cylinders == 4) sum(Cylinders == 6) sum(Cylinders == 8)])
Napisz funkcję o nazwie regresja
, która dla danych wektorów $x$ i $y$ zwróci współczynniki $a$ i $b$ określające linię prostą $y = a x + b$ dopasowaną do danych $x$ i $y$ za pomocą metody najmniejszych kwadratów.
Dla danych $x_i$ i $y_i$ (gdzie $i=1,2,\ldots,n$) współczynniki $a$ i $b$ wyznacz ze wzoru:
$$ a=\frac{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)\left(y_{i}-\bar{y}\right)}{\sum_{i=1}^{n}\left(x_{i}-\bar{x}\right)^{2}} $$
$$ b=\bar{y}-a \bar{x} $$ gdzie $\bar{x}$ i $\bar{y}$ to wartości średnie zmiennych.
Argumentami funkcji są dwa wektory $x$ i $y$. Jeżeli rozmiary wektorów nie zgadzają się, funkcja zwraca stosowany komunikat błędu oraz przerywa swoje działanie. Jeżeli użytkownik poda za mało lub za dużo argumentów, wówczas funkcja również zwraca odpowiedni komunikat z błędem i kończy swoje działanie. Do wypisania komunikatów z błędem wykorzystaj funkcję error()
.
Przykład działania funkcji:
x = 0:.1:10; y = 2 * x - 10; % dodajemy troche szumu y = y + 3*randn(size(x)); [a b] = regresja(x, y) plot(x, y, 'o'); hold on plot(x, a*x+b,'-');
a = 2.0233 b = -10.155