function [b,R] = QR_decomp(A,b)
% realisiert die QR-Zerlegung für injektive Matrizen nach Algorithmus 4 der VL

% Größe der Matrix extrahieren
[m,n] = size(A);
% R initialisieren
R = A;
for j = 1:n
    % den entsprechenden Teilblock der Matrix, die 1. Spalte dieses Blockes und den 1. Eintrag dieser ersten Spalte definieren; wg. 2. +1 siehe b_j
    A_j = R(end-(m-j+1)+1:end,end-(n-j+1)+1:end);
    x = A_j(:,1);
    x1 = x(1);
    % ebenso den Anteil von b definieren - das 2. +1, da nur die unteren n-j+1 Einträge betrachtet werden, d.h. insbesondere nicht der end-n-j+1. Eintrag
    b_j = b(end-(m-j+1)+1:end);
    % erstelle den 1. Einheitsvektor
    e1 = zeros(m-j+1,1);
    e1(1) = 1;
    % erstelle v
    if abs(x1) < 1e-12
        v = x/norm(x) + e1;
    else
        v = x/norm(x)*abs(x1)/x1 + e1;
    end
    % erstelle w
    w = 2/(v'*v)*v;
    % neuer Teilblock und Teil von b
    A_j = A_j - w*(v'*A_j);
    b_j = b_j - w*(v'*b_j);
    % jeweiligen Teile in R und b schreiben
    R(end-(m-j+1)+1:end,end-(n-j+1)+1:end) = A_j;
    b(end-(m-j+1)+1:end) = b_j;
end