%
% 1.1 Suma y resta de matrices (m×n)

% Ejercicio 1.1a
A = randi([1,10],3,4);
B = randi([1,10],3,4);
C = A + B;
D = A - B;
disp('A ='), disp(A)
disp('B ='), disp(B)
disp('C = A + B ='), disp(C)
disp('D = A - B ='), disp(D)

% 1.2 Multiplicación de matrices (compatible de dimensiones)

% Ejercicio 1.2a
X = [1 4 2; 3 5 7];
Y = [2 0; 1 3; 5 6];
M = X * Y;
disp('X ='), disp(X)
disp('Y ='), disp(Y)
disp('M = X * Y ='), disp(M)

% 2. Producto vectorial, matricial; inversa y transpuesta
% 2.1 Producto vectorial y producto matricial

% Ejercicio 2.1a
u = [2; -1; 3];
v = [1; 4; 0];
w = cross(u,v);
s = dot(u,v);
disp('cross(u,v) ='), disp(w)
disp('dot(u,v) ='), disp(s)

% 2.2 Transpuesta e inversa de una matriz (n×n)

% Ejercicio 2.2a
P = [4 -2 1; 0 3 -1; 2 1 5];
PT = P.';
dP = det(P);
if dP ~= 0
    Pinv = inv(P);
else
    warning('P es singular: no tiene inversa.')
end
disp('P ='), disp(P)
disp('Transpuesta P.'' ='), disp(PT)
disp('det(P) ='), disp(dP)
if exist('Pinv','var')
    disp('Inversa inv(P) ='), disp(Pinv)
end

% 3. Determinantes y adjunta
% 3.1 Cálculo de determinantes por expansión de cofactores

% Ejercicio 3.1a: función cofdet
function d = cofdet(A)
    [n,~] = size(A);
    if n == 1
        d = A(1,1);
    else
        d = 0;
        for j = 1:n
            M = A;
            M(1,:) = [];      % eliminar fila 1
            M(:,j) = [];      % eliminar columna j
            cofactor = (-1)^(1+j) * A(1,j) * cofdet(M);
            d = d + cofactor;
        end
    end
end

% Uso:
Q = [1 2 3; 0 -1 4; 5 2 0]
dQ = cofdet(Q);
disp('det(Q) por cofactores ='), disp(dQ)
disp('det(Q) MATLAB ='), disp(det(Q))

% 3.2 Determinantes e inversas

% Ejercicio 3.2a
P = [4 -2 1; 0 3 -1; 2 1 5]
% Matriz de cofactores:
C = zeros(3);
for i = 1:3
    for j = 1:3
        M = P;
        M(i,:) = []; M(:,j) = [];
        C(i,j) = (-1)^(i+j) * det(M);
    end
end
adjP = C.';           % adjunta
dP = det(P);
Pinv_from_adj = (1/dP) * adjP;
Pinv = inv(P);
disp('adj(P) ='), disp(adjP)
disp('inv(P) via adj ='), disp(Pinv_from_adj)
disp('inv(P) MATLAB ='), disp(Pinv)

% 3.3 La adjunta de una matriz

adjQ = zeros(3);
for i = 1:3
    for j = 1:3
        M = Q;
        M(i,:) = []; M(:,j) = [];
        adjQ(j,i) = (-1)^(i+j) * det(M);  % ojo al transponer
    end
end
disp('adj(Q) ='), disp(adjQ)