Генерация случайной матрицы в MATLAB - PullRequest
0 голосов
/ 05 января 2020

Я хотел бы сгенерировать 100 случайных матриц A=[a_{ij}] размера 6 на 6 в (0, 9), используя программирование matlab, удовлетворяющее следующим свойствам:

 1. multiplicative inverse:      i.e., a_{ij}=1/a_{ji}      for all i,j=1,2,...,6.
 2. all entries are positive:    i.e., a_{ij}>0             for all i,j=1,2,...,6.
 3. all diagonal elements are 1: i.e., a_{ii}=1             for all i=1,2,..,6.
 4. transitive:                  i.e., a_{ih}*a_{hj}=a_{ij} for all i,j,h=1,2,...,6.

До сих пор я пытался использовать функцию matlab rand(6)*9. Но я получил неправильные матрицы. Мне было интересно, может ли кто-нибудь помочь мне?

Вот мой код Matlab:

clc; clear;
n=6;
m=0;
for i=1:n
    for j=1:n
        for h=1:n
            while m<100  % generate 100 random matrices
                A=rand(n)*9;           % random matrix in (0,9)
                A(i,j)>0;              % positive entries
                A(i,j)==1/A(j,i);      % multiplicative inverse
                A(i,h)*A(h,j)==A(i,j); % transitive
                if i==j && j==h
                    A(i,j)==1;         % diagonal elements are 1
                break;
            end
            m=m+1;
            M{m}=A
        end
    end
end
end
M{:}      

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Мне понадобилось немного времени, чтобы подумать о вашем вопросе, но я понял, что решения не существует.

Требуется, чтобы ваши элементы A были равномерно распределены в диапазоне (0,9). Вам также требуется a_ {ij} * a_ {jk} = a_ {ik}. Поскольку произведение двух равномерных распределений не является равномерным распределением, ваш вопрос не имеет решения.

2 голосов
/ 05 января 2020
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 случайных переменных, их распределение никогда не будет абсолютно равномерным, но цель здесь состоит в том, чтобы поддерживать разумный масштаб для них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...