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ó)
- eye(n) Matriu identitat de dimensió nxn
- rand(m,n) Matriu de valors aleatoris en [0,1] de m files i n columnes
- ones(m,n) Matriu constant amb tots els elements iguals a 1
- magic(n) Matriu de dim nxn que totes les files i columnes sumen el mateix
- diag(v) Matriu diagonal amb el vector v com la seva diagonal
- hilb(n) Matriu de Hilbert de dim nxn
A=eye(4)+ones(4)+hilb(4)
B=inv(A);
matIdent=A*B %noteu els sospitosos -0.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
format short e
fShortE = A*B %ara ja veiem que son valors molt petits (mireu l'exponent!!)
format long e
fLongE = A*B %finalment veiem totes les xifres significatives (però el que compta és l'exponent!!)
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
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
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
Adsup=diag(v(1:3),1) %primera diagonal per sobre (només 3 elements)
Adinf=diag(v(1:3),-1) %primera diagonal per sota
altres possibilitats
A = magic(5)
ALD = tril(A) %matriu amb la part triangular inferior (lower) d'A (diagonal inclosa)
AL = tril(A,-1) %sense la diagonal
AUD = triu(A) %matriu amb la part triangular superior (upper) d'A (diagonal inclosa)
AU = triu(A,1) %sense la diagonal
D = diag(A) %vector amb la diagonal d'A
AD = diag(diag(A)) %matriu diagonal amb la diagonal d'A
A-(AU+AD+AL) %comprovem que és el mateix
Exemple de construcció d'una matriu
La matriu
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
Ainv = inv(A) %calcula la inversa
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
% comprovem que dona el mateix (tot i que el càlcul és diferent)
xx=Ainv*b;
x-xx
exemple sistema sobredeterminat
B=[ones(5,1),(1:5)'];
b=(1:2:10)';
y=B\b
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)
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