clear; clc
M = cell(1, 100); % preallocate memory
% matrix contains both x & 1/x
% we need a distribution whose multiplication with its inverse is uniform
pd = makedist('Triangular', 'a', 0, 'b', 1, 'c', 1);
for m=1:100 % 100 random matrices
A = zeros(6); % allocate memory
% 5 random numbers for 6x6 transitive random matrix
a = random(pd, 1, 5);
% choose a or 1/a randomly
ac = rand(1, 5) < 0.5;
% put these numbers above the diagonal
for i=1:5
if ac(i)
A(i, i+1) = a(i);
else
A(i, i+1) = 1 / a(i);
end
end
% complete the transitivity going above
for k=flip(1:4)
for i=1:k
A(i, i-k+6) = A(i, i-k+5) * A(i-k+5, i-k+6);
end
end
% lower triangle is multiplicative inverse of upper triangle
for i=2:6
for j=1:i-1
A(i,j) = 1 / A(j,i);
end
end
c = random(pd); % triangular random variable between (0,1)
A = A ./ max(A(:)) * 9 * c; % range becomes (0, 9*c)
% diagonals are 1
for i=1:6
A(i,i) = 1;
end
% insert the result
M{m} = A;
end
На самом деле 5 чисел независимы в переходной матрице 6x6. Остальные получены из них, как показано в коде.
Причина, по которой tri angular distribution используется для этих чисел, заключается в том, что pdf для tri angular distribution равен f (x ) = x, а pdf обратного распределения tri angular равно f -1 (x) = 1 / x; таким образом их умножение становится равномерным распределением. (См. Pdf обратное распределение )
A = A ./ max(A(:)) * 9;
составляет диапазон (0,9), но максимальным элементом всегда будет 9. Нам нужно уменьшить результат случайным коэффициентом, чтобы получить результат, равномерно распределенный в (0,9). Поскольку A
распределен равномерно, мы можем добиться этого снова с помощью распределения angular. (См. Распределение продукта )
Другим решением проблемы диапазона будет вычисление A
, в то время как его максимум выше 9. Это устранит последнюю проблему.
Поскольку все элементы A
зависят от 5 случайных переменных, их распределение никогда не будет абсолютно равномерным, но цель здесь состоит в том, чтобы поддерживать разумный масштаб для них.