Back to Uniform random rotation matrix
% Description: Testing for random_orthogonal.m.
% DocumentationOf: random_orthogonal.m
function [] = test_random_orthogonal()
clear all;
close all;
figure;
drawAngleHistogram(@correctAlgorithm)
title('Eigenvalue-angle distribution (correct algorithm)')
figure;
drawAngleHistogram(@incorrectAlgorithm)
title('Eigenvalue-angle distribution  (incorrect algorithm)')
end
function Q = correctAlgorithm(d, orientation)
    eval(import_pastel);
    Q = random_orthogonal(d, 'orientation', orientation);
end
function Q = incorrectAlgorithm(d, orientation)
     [Q, R] = qr(randn(d, d));
     % Leaving this normalization step out
     % provides an incorrect algorithm.
     %Q(:, diag(R) < 0) = -Q(:, diag(R) < 0);
     if (orientation ~= 0 && sign(det(Q)) ~= orientation)
        Q(:, 1) = -Q(:, 1);
     end
end
function y = drawAngleHistogram(algorithm)
    d = 8;
    n = 2000;
    angleSet = zeros(d, n);
    for i = 1 : n
         orientation = 1;
         Q = algorithm(d, orientation);
         assert(orientation == 0 || sign(det(Q)) == sign(orientation));
         E = eig(Q);
         angleSet(:, i) = angle(E);
    end
    hist(angleSet(:), 100);
end