Creació de Matrius en Matlab

Dins el Matlab, totes les variables son tractades com matrius. Fins i tot un escalar és una matriu 1x1.

Matrius elementals

Matlab incorpora un seguit de funcions per crear matrius: (consultar la documentació)
A=eye(4)+ones(4)+hilb(4)
A = 4×4
3.0000 1.5000 1.3333 1.2500
1.5000 2.3333 1.2500 1.2000
1.3333 1.2500 2.2000 1.1667
1.2500 1.2000 1.1667 2.1429
B=inv(A);
matIdent=A*B %noteu els sospitosos -0.0000 (????)
matIdent = 4×4
1.0000 -0.0000 0.0000 0.0000
-0.0000 1.0000 0 0
0.0000 -0.0000 1.0000 0
0.0000 -0.0000 0 1.0000

Exercici 1

Canvieu el format de mostrar els números dins el Matlab (per defecte és el format short) escrivint en linia de comandes. Valoreu el resultat (el valor més important és l'exponent).
format long
fLong = A*B %encara es veuen els -0.00000000
fLong = 4×4
1.000000000000000 -0.000000000000000 0.000000000000000 0.000000000000000
-0.000000000000000 1.000000000000000 0 0
0.000000000000000 -0.000000000000000 1.000000000000000 0
0.000000000000000 -0.000000000000000 0 1.000000000000000
format short e
fShortE = A*B %ara ja veiem que son valors molt petits (mireu l'exponent!!)
fShortE = 4×4
1.0000e+00 -1.1102e-16 1.1102e-16 1.1102e-16
-1.1102e-16 1.0000e+00 0 0
1.1102e-16 -1.1102e-16 1.0000e+00 0
1.1102e-16 -1.1102e-16 0 1.0000e+00
format long e
fLongE = A*B %finalment veiem totes les xifres significatives (però el que compta és l'exponent!!)
fLongE = 4×4
1.000000000000000e+00 -1.110223024625157e-16 1.110223024625157e-16 1.110223024625157e-16
-1.110223024625157e-16 9.999999999999999e-01 0 0
1.110223024625157e-16 -1.110223024625157e-16 9.999999999999999e-01 0
1.110223024625157e-16 -1.110223024625157e-16 0 9.999999999999999e-01
format short %recuperem el format original

Recorrer els elements d'una matriu

Els elements d'una matriu quasi sempre els recorrerem amb una instrucció for ja que sempre sabrem el número total d'iteracions del bucle
m = 4; %files
n = 3; %columnes
A=zeros(m,n);
for i=1:m %index de fila
for j=1:n %index de columna
A(i,j)=1; %valor constant
end
end
B=ones(m,n);
error1 = A-B %verifiquem si dona el mateix
error1 = 4×3
0 0 0
0 0 0
0 0 0
0 0 0

Suma per files i columnes

% Ara volem sumar les files de A de dues maneres
%
% per elements (a pic i pala!!):
%
sumaF=zeros(m,1); % un vector de m files i 1 colum que contindrà la suma
for i=1:m
sumaF(i)=0; %inicialment la suma de la fila i és 0
for j=1:n
sumaF(i)=sumaF(i)+A(i,j);
end
end
%
% Utilitzant eines del Matlab
%
sumFila=sum(A,2); %es fa la suma variant la segona component (suma per files)
% consulteu la funció sum
error2=sumaF-sumFila %verifiquem si dona el mateix
error2 = 4×1
0
0
0
0

Exercici 2

Feu el mateix però amb la suma per columnes. Apliqueu això a una matriu creada amb la instrucció magic.

Funcions per manipular matrius: diag, tril, triu

Per definir o treure informació d'una matriu podem utilitzar aquestes funcions de Matlab (consulteu la documentació)
v=[4,2,5,1];
A=diag(v) %matriu diagonal amb el vector v com a diagonal
A = 4×4
4 0 0 0
0 2 0 0
0 0 5 0
0 0 0 1
Adsup=diag(v(1:3),1) %primera diagonal per sobre (només 3 elements)
Adsup = 4×4
0 4 0 0
0 0 2 0
0 0 0 5
0 0 0 0
Adinf=diag(v(1:3),-1) %primera diagonal per sota
Adinf = 4×4
0 0 0 0
4 0 0 0
0 2 0 0
0 0 5 0
altres possibilitats
A = magic(5)
A = 5×5
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
ALD = tril(A) %matriu amb la part triangular inferior (lower) d'A (diagonal inclosa)
ALD = 5×5
17 0 0 0 0
23 5 0 0 0
4 6 13 0 0
10 12 19 21 0
11 18 25 2 9
AL = tril(A,-1) %sense la diagonal
AL = 5×5
0 0 0 0 0
23 0 0 0 0
4 6 0 0 0
10 12 19 0 0
11 18 25 2 0
AUD = triu(A) %matriu amb la part triangular superior (upper) d'A (diagonal inclosa)
AUD = 5×5
17 24 1 8 15
0 5 7 14 16
0 0 13 20 22
0 0 0 21 3
0 0 0 0 9
AU = triu(A,1) %sense la diagonal
AU = 5×5
0 24 1 8 15
0 0 7 14 16
0 0 0 20 22
0 0 0 0 3
0 0 0 0 0
D = diag(A) %vector amb la diagonal d'A
D = 5×1
17
5
13
21
9
AD = diag(diag(A)) %matriu diagonal amb la diagonal d'A
AD = 5×5
17 0 0 0 0
0 5 0 0 0
0 0 13 0 0
0 0 0 21 0
0 0 0 0 9
A-(AU+AD+AL) %comprovem que és el mateix
ans = 5×5
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

Exemple de construcció d'una matriu

La matriu
Exemple.png
Es pot construir a partir de les instruccions:
v1=1:10; v2=4:2:20; v3=-3*ones(1,10;
A=diag(v1) + diag(v2,+1) + diag(v3,-1);
A(1,10) = -50; A(10,1)=25;

Algebra Lineal: rank, det, inv, eig

Matlab incorpora un gran conjunt de funcions per a poder estudiar una matriu
A=eye(4)+ones(4)+hilb(4);
[rank(A), det(A)] %calcula el rang i el determinant d'una matriu
ans = 1×2
4.0000 8.5902
Ainv = inv(A) %calcula la inversa
Ainv = 4×4
0.5597 -0.2151 -0.1515 -0.1236
-0.2151 0.7801 -0.2077 -0.1983
-0.1515 -0.2077 0.7814 -0.2208
-0.1236 -0.1983 -0.2208 0.7700

Sistemes lineals

Si volem resoldre un sistema Ax=b el Matlab ens ofereix l'operador \ (en anglès backslash)
Obs. Aquest operador resol el sistema amb una descomposició LU si és compatible determinat (m=n i det(A)~=0) o amb una descomposició QR si és sobredeterminat (m > n i rank=n) donant la solució mínim quadràtica.
% exemple sistema compatible determinat
b = ones(4,1);
x = A\b
x = 4×1
0.0696
0.1590
0.2015
0.2274
% comprovem que dona el mateix (tot i que el càlcul és diferent)
xx=Ainv*b;
x-xx
ans = 4×1
10-15 ×
0.0416
0.1110
0
-0.0278
exemple sistema sobredeterminat
B=[ones(5,1),(1:5)'];
b=(1:2:10)';
y=B\b
y = 2×1
-1.0000
2.0000

Generació i visualització d'una matriu binària (força gran)

Si entenem per matriu binària aquella que només te 1 o 0 en les seves components, la podem generar fent servir la instrucció rand i arrodonint els valors. Per visualitzar matrius grans podem utilitzar la funció de Matlab spy que mostra només els elements diferents de zero.
m=60; %fem una matriu suficientment gran
n=40;
A=round(rand(m,n)); %en arrodonir, els valors seran només 1 o 0
spy(A); %mostra els valors diferents de zero en una matriu i els compta
% Pregunta: perquè no tindria massa sentit utilizar les funcions
% A=ceil(rand(m,n)) o A=floor(rand(m,n)) ?

Imatges Binàries en Matlab

Un tipus especial de matrius binàries son les imatges amb el mateix nom, ja que a cada pixel guarden només un 0 o un 1
Carregar una imatge amb Matlab és molt fàcil (llàstima que aquest taller no dona per aprofundir en el tema d'imatges.... :-)
imatge=imread('BinR2D2.png'); %comproveu el path de la imatge per si de cas
[m,n]=size(imatge)
m = 361
n = 244
imshow(imatge); %per mostrar-ho com una imatge
spy(imatge); %de fet, es tracta d'una matriu i la podem visualitzar
(c)Numerical Factory, 2020