function [ C ] = znfErweiterung( A ) %function znfEerwiterung.m %Geschrieben von Alexander Fritz %Große Teile wurden aus den Programmen zeilennormalform.m und %zeilenstufenform.m uebernommen. %Das Programm wurde etwas angepasst, daher fehlen ein paar Teile und einige %Variablen haben andere Bezeichnungen. %Dieses Programm erweitert die Zeilennormalform mit der -1 Ergaenzung. [z,sp] = size(A); %%%%%Ergaenzen der gegebenen Matrix um eine quadratmatrix zu erhalten ( %%%%%einfacher zum programmieren) if z < sp ez = z; %esp und ez sind dazu da um für später zu esp = 0; %wissen wie man erweitert hat E = zeros(sp,sp); for i = 1 : z E(i,1:sp) = A(i,1:sp); end z = sp; elseif z > sp ez = 0; esp = sp; E = zeros(z,z); for i = 1 : sp E(1:z,i) = A(1:z,i); end sp = z; else ez = z; esp = sp; E = A; end i = 1; for n = 1 : sp m = i; while (m < z && E(m,n) == 0) m = m + 1; end if (E(m,n) ~= 0) for k = (m + 1) : z if (E(k,n) ~= 0) E(k,n:sp) = E(k,n:sp) - (E(k,n)/E(m,n)).* E(m,n:sp); end end if (m ~= 1) B = E(i,n:sp); E(i,n:sp) = E(m,n:sp); E(m,n:sp) = B; end i = i + 1; end end %%%%%fuer naehere Beschreibung siehe "zeilenstufenform.m" for i = 1 : z n = 1; while (E(i,n) == 0 && n < sp) n = n + 1; end k(i) = n + (E(i,n) == 0); end r = z; while (k(r) == n + 1) r = r - 1; end %%%%%fuer naehere Beschreibung siehe "ZSFueberpruefen.m" for i = 1 : r E(i,1:sp) = E(i,1:sp)./E(i,k(i)); end for i = 1 : r for n = 1 : i-1 E(n,1:sp) = E(n,1:sp) - E(n,k(i))*E(i,1:sp); end end %%%%%fuer naehere Beschreibung siehe "zeilennormalform.m" for m = 1 : z %Die einzelnen Zeilen werden von der Ersten aus durchgegangen n = m; %Da die Matrix bereits in ZNF ist muessen wir uns nur die Spalten ab m ansehen c = 0; while (c == 0) if (E(m,n) == 0) %Es wird geprueft, ob sich auf der Diagonalen bereits eine 1 befindet while (E(m,n) == 0 && n < sp) %falls nicht wird das Erste nicht 0 Element gesucht n = n+ 1; end if (E(m,n) == 0) %falls es keine 1 in der Zeile gibt(alles 0en) E(m,m) = -1; %wird in E(m,m) eine -1 eingesetzt(in der Diagonalen) c = 1; else %falls es eine 1 in der Zeile gibt wird die Zeile B = E(n,1:sp); E(n,1:sp) = E(m,1:sp); %in die (Zeile = Spalte mit 1) verschoben (die Zeilen werden vertauscht) E(m,1:sp) = B; end else c = 1; end end end if ez < esp %1.Fall die Anzahl der Spalten wurde vergrößert for i = z : -1 : 1 %Man geht die Matrix von unten durch und sucht nach 0 Zeilen if (E(i,1:esp) == 0) C = E(1:i-1,1:esp); %Die Matrix wird um die 0 Zeilen gekürzt und die Anzahl der Spalten wird wieder gekürzt. end end else %2.Fall die Anzahl der Zeilen wurden vergrößert/ ist gleich geblieben C = E; %Die Matrix wird 1:1 übernommen end %%%%%jetzt sind auf der Diagonalen nur noch 1en und -1en und die Ergaenzung %%%%%ist vollstaendig. end