% ZAPG 2024, CV2
clc; clear all;

% 1) Matice
A = [1 5 8; 
     8 7 9; 
     1 0 2];  % matice 3x3

b = [7;5;4];                % sloupcovy vektor, i.e. matice typu 3x1

detA  = det(A)                      % determinant ctvercove matice A
rankA = rank(A)                     % hodnost matice A

% podminka typu 'if'
if (det(A) == 0)
    fprintf('Matice A je singularni\n');
else
    fprintf('Matice A je regularni\n');
end


% vypocet soustavy A*x=b (pomoci MATLAB operatoru: '\')
x = A\b;
x 
 
% Pristup k prvkum matice

A                    % zobrazi vyslednou matici
A(1,1)               % prvek na pozici 1,1
A(:,1)               % 1. sloupec (: = prochazime vsechny indexy)
A(2,:)               % 2. radek
A(:,:)               % cela matice
A(1:2,2:3)           % sub-matice 1. a 2. radek, 2. a 3. sloupec
A(:)                 % seradi sloupce matice A do 1 slopucoveho vektoru


% Cramerovo pravidlo:

% x = [x1,x2,x3]
% x1 = det(A1) / det(A)
% x2 = det(A2) / det(A)
% x3 = det(A3) / det(A)


i = 1; % hodnoty 1,2,3
A(:,i) = b           % nahrazeni i-teho sloupce v matici A vektorem b
                     % pozor! zmenime hodnoty v puvodni matici

A_pokus = [b, b, b]  

A1 = [b,A(:,2:3)]    % takto vytvorime novou matici, 1. sloupec = b,
                     % 2. a 3. slpoupec z matice A
                     % nova matice prirazena do nove promenne A1

A = [1 5 8; 8 7 9; 1 0 2]; % znovu zde predefinujeme puvodni matici
detA = det(A);             % spocitame determinant puvodni matice A
                           % pouze 1 (budeme ho vyuzivat dale...)
% Cramer
x1 = det( [b,A(:,2:3)] )        / detA;
x2 = det( [A(:,1), b, A(:,3)] ) / detA;
x3 = det( [A(:,1:2),b]  )        / detA;

x_orig = A\b
x_cramer = [x1;x2;x3]

% jiny (slozitejsi, ale elegantnejsi zpusob, ale pro 'libovolne' velkou  matici)
B = [1 4 5 8 9; 5 7 8 9 7; 1 2 4 7 7; 7 7 8 8 9; 1 2 3 4 5]
b2 = [7;8;9;1;2]

% matice B ma M-radku, N-sloupcu
M = size(B,1) % i.e. pocet radku   (1. = i-ty index)
N = size(B,2) % i.e. pocet sloupcu (2. = j-ty index)

for i=1:N % cyklus od 1 do N (s krokem 1)
   B_i = [B(:, 1:i-1), b2, B(:, i+1:end)];
   X(i) = det(B_i) / det(B);
end
% 'overeni'
X'      % transpozice
B\b2    % MATLAB deleni





