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