% % generăm vectori bipolari random, fiecare chip este +1 sau -1 % se verifică cât de ortogonali față de x sunt 1000 de vectori generați % % Codul nu este de executat secvențial, ci pe secțiuni pentru a se % inspecta rezultatele, histogramele, etc. % N = 2^12; % vector bipolar random rh = 2*(round(rand(N, N)) - 0.5); % aproape același număr de apariții de -1 și +1 srh = sum(rh); hist(srh, 20, 1); % produsul a 2 vectori aleatori i1 = ceil(N*rand(1,1)) i2 = ceil(N*rand(1,1)) rh(i1,:) *rh(i2, :)' % trebuie să fie aproape de 0 h = hadamard(N); % h sunt garantat ortogonale x = h(:, 2); for i = 1:N % generează un vector nou y = 2*(round(rand(N, 1)) - 0.5); % este ortogonal cu x? vx(i) = x'*y; endfor % vx poate lua valori în -N..N % în realitate vx este o sumă de variabile aleatoare independente % deci este normală (teorema limitei centrale) % media este aproape de 0 mean(vx) max(abs(vx))/4096 var(vx) % deviația este sqrt(N) std(vx) % arată normală! hist(vx, 20, 1); % câți vectori din cei N generați nu sunt suficient de ortogonali? size(find(abs(vx) > 4*sqrt(N))) %cam 3 procente (pt N=4096) % worst case max(abs(vx)) 4*sqrt(N) %exemple de vectori aleatori i1 = ceil(N*rand(1,1)) i2 = ceil(N*rand(1,1))