Как генерировать случайную обратимую симметричную положительную полуопределенную матрицу? - PullRequest
0 голосов
/ 04 сентября 2018

Как я могу сгенерировать случайную, обратимую, симметричную, положительную полуопределенную матрицу, используя MATLAB?

Я нашел этот код Python:

matrixSize = 10
A = random.rand(matrixSize,matrixSize)
B = numpy.dot(A,A.transpose())

Но я не уверен, генерирует ли это случайную положительную полуопределенную матрицу B.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Для любого eps> 0 и любой nxk (для любого k) матрицы B матрица

P = eps*I + B*B'

положительно определен и обратим. Если k


код MATLAB для получения P:

n = 10;
k = 1;
B = rand(n,k);
B = B * B.';
P = B + eye(size(B)) * eps(max(B(:)));
0 голосов
/ 04 сентября 2018

MATLAB-эквивалент вашего кода:

matrixSize = 10;
A = rand(matrixSize);
B = A * A.';

Это дает симметричную положительно-полуопределенную матрицу. Но эта матрица не обязательно обратима, возможно (хотя и очень маловероятно), что матрица является единственной. Скорее всего, это почти единственное число, то есть обратное значение получит очень большие значения. Этот обратный неточен, и B*inv(B) будет отличаться от матрицы идентификаторов на величину, превышающую ваш допуск.

Один простой способ убедиться, что B*inv(B) находится в пределах допуска единичной матрицы, - это многократно генерировать случайную матрицу, пока вы не найдете такую, которая в порядке:

tol = 1e-12;
while true
   A = rand(matrixSize);
   B = A*A.';
   err = abs(B*inv(B) - eye(matrixSize));
   if all(err(:)<tol)
      break
   end
end

Приведенный выше цикл будет выполняться только один раз большую часть времени, только изредка ему потребуется генерировать вторую матрицу.

...