#!/usr/bin/octave -q
% generator różnych prostych rozkładów
% (całkowitych i ułamków zwyczajnych)
% do uruchomienia w środowisku Octave/Matlab
% formatowanie wyników zgodne ze składnią LaTeXa
%
% wersja z 2015.12.11
function a = printarray(array,name,fid,normalize = 0)
fprintf (fid, "%s", name)
if normalize!=1
fprintf (fid, " = ")
end
fprintf (fid, "\\left[ \\begin{array}{rr} ")
printf ("\n%s\n",name)
if fid == 1
fids = [fid];
else
fids = [fid 1];
end
for f = fids
for i = 1:size(array)(1)
for j = 1:size(array)(2)
if (abs(round(array(i,j))-array(i,j))>3*eps) && normalize == 0
if array(i,j)<0
sign="-";
snum = array(i,j)*-1;
else
sign = "";
snum = array(i,j);
end
s = rats(snum);
s = strrep(s,"/","}{");
if f!=1
fprintf (f, "%s\\frac{%s} ", sign,strtrim(s) )
else
fprintf (f, "%6s ", rats(snum) )
end
elseif normalize
if testint(array(i,j))
if array(i,j) == 0
fprintf (f, "%d" , 0 )
else
fprintf (f, "\\frac{1}{%d} ", array(i,j))
end
else
fprintf (f,"\\frac{1}{\\sqrt{%d}} ", array(i,j)^2 )
end
else
fprintf (f, "%6d ", array(i,j))
end
if j<size(array)(2)
if f!=1
fprintf (f," & ")
else
fprintf (f," ")
end
else
if f!=1
fprintf (f," \\\\ ")
else
fprintf (f," \n")
end
end
end
end
if f!=1
fprintf (f, "\\end{array}\\right]")
end
end
end
function t = testint(real)
t = abs(round(real)-real)<3*eps;
end
row = 3 ;
col = 3 ;
count = 12 ;
FORCE_SYMMETRIC = 0;
FORCE_WITH_PERMUTATION = 0;
nr_total = 0 ;
for dimension = [2 3]
row = col =dimension;
if dimension == 2
how_many_zeros = 0;
end
if dimension == 3
how_many_zeros = 2;
end
if dimension == 4
how_many_zeros = 20;
end
fileout = ["rozklady", int2str(dimension), ".dat"];
fid = fopen (fileout,"w");
fprintf (fid,"<ul>\n")
array_of_A=[];
for nr = 1:count
nr_total++;
if nr <=count/2
FORCE_SYMMETRIC = 0;
else
FORCE_SYMMETRIC = 1;
end
if mod(abs(nr)-count/2,count/2) < count/4
FORCE_INTEGER_EIG = 0;
else
FORCE_INTEGER_EIG = 1;
end
if (dimension>2)
FORCE_INTEGER_EIG =0
end
ii=0;
do
ii++;
A = randi([-9 9],row,col);
if FORCE_SYMMETRIC == 1
for i = 1:size(A)(1)
for j = i+1:size(A)(2)
A(i,j) = A(j,i);
end
end
else
if (A == A')
continue;
end
end
if sum(sum(A == 0)) > how_many_zeros
continue;
if any(all(all(A == array_of_A)))
continue;
end
end
if FORCE_INTEGER_EIG == 1
[v lambda]=eig(A);
if !all(all(testint(48*lambda)))
continue
end
end
[Q R]=qr(A);
flag = 0;
for n = 1:col
if R(n,n) <0
flag = 1 ;
break
end
end
if flag == 1
continue
end
if all(all(testint(R)))
[L, U, P] = lu(A);
if (diag(U)!=0)
if all(diag(L)==1)
if all(diag(P)==1) && FORCE_WITH_PERMUTATION == 0
break;
end
if !all(diag(P)==1) && FORCE_WITH_PERMUTATION == 1
break
end
end
end
end
until 0
array_of_A(:,:,nr) = A;
D = diag([diag(U)']);
Uprim = inv(D)*U;
if FORCE_SYMMETRIC == 1
if Uprim == L'
end
end
fprintf (fid,"\t<li>\n\t\t<ul id=\"rozwin\">\n")
fprintf (fid,"\t\t\t<li>\n\t\t\t<a>Przykład %d — $A_{%dx%d}$", nr_total,row,col)
if FORCE_SYMMETRIC
fprintf (fid, " [m. symetryczna]")
end
if FORCE_WITH_PERMUTATION
fprintf (fid, " NIEZBĘDNA PERMUTACJA")
end
fprintf (fid,"</a>\n\t\t\t<div class=\"rozwin\">\n")
fprintf(fid,"$$")
printarray(A,"A",fid)
fprintf(fid,"$$")
fprintf (fid,"\n\t\t\t</div>\n\t\t\t</li>\n")
fprintf (fid,"\t\t\t | <li>\n\t\t\t<a>$LU$</a>\n")
fprintf (fid,"\t\t\t<div class=\"rozwin\">")
fprintf(fid,"$$")
printarray(L,"L",fid)
fprintf(fid,";\\quad ")
printarray(U,"U",fid)
fprintf(fid,"$$")
fprintf (fid,"\n\t\t\t</div>\n\t\t\t</li>")
if (Uprim == L')
fprintf (fid,"\t\t\t | <li>\n\t\t\t<a>$LDU'=LDL^T$</a>\n")
else
fprintf (fid,"\t\t\t | <li>\n\t\t\t<a>$LDU'$</a>\n")
end
fprintf (fid,"\t\t\t<div class=\"rozwin\">")
fprintf(fid,"$$")
printarray(L,"L",fid)
fprintf(fid,";\\quad ")
printarray(D,"D",fid)
fprintf(fid,";\\quad ")
if (Uprim == L')
printarray(Uprim,"U'=L^T",fid)
else
printarray(Uprim,"U'",fid)
end
fprintf(fid,"$$")
fprintf (fid,"\n\t\t\t</div>\n\t\t\t</li>")
fprintf (fid,"\t\t\t | <li>\n\t\t\t<a>$QR$</a>\n")
fprintf (fid,"\t\t\t<div class=\"rozwin\">")
fprintf(fid,"$$")
printarray(Q,"Q",fid)
fprintf(fid,";\\quad ")
printarray(R,"R",fid)
fprintf(fid,"$$")
fprintf (fid,"\n\t\t\t</div>\n\t\t\t</li>")
if FORCE_INTEGER_EIG == 1
for i = 1 : col
[~,inx] = min(abs(v(:,i)));
v(:,i) = v(:,i)/v(inx,i);
end
fprintf (fid,"\t\t\t | <li>\n\t\t\t<a>$S \\Lambda S^{-1}$</a>\n")
fprintf (fid,"\t\t\t<div class=\"rozwin\">")
fprintf(fid,"$$")
printarray(v,"S",fid)
fprintf(fid,";\\quad ")
printarray(lambda,"\\Lambda",fid)
fprintf(fid,";\\quad ")
printarray(inv(v),"S^{-1}",fid)
fprintf(fid,"$$")
fprintf (fid,"\n\t\t\t</div>\n\t\t\t</li>")
if FORCE_SYMMETRIC ==1
fprintf (fid,"\t\t\t | <li>\n\t\t\t<a>$Q \\Lambda Q^{T}$</a>\n")
fprintf (fid,"\t\t\t<div class=\"rozwin\">")
fprintf(fid,"$$")
M = sqrt(diag([ diag(v'*v)]));
printarray(M,"Q = S\\cdot ",fid,1)
fprintf(fid,"$$")
fprintf (fid,"\n\t\t\t</div>\n\t\t\t</li>")
end
end
fprintf (fid,"\n\t\t\t</div>\n\t\t\t</li>")
fprintf (fid,"\n\t\t</ul>\n")
fprintf (fid,"\t</li>\n")
end
if fid != 1
fprintf (fid,"</ul>\n")
fclose(fid);
end
end