Java中的随机可逆矩阵

时间:2016-03-06 21:24:42

标签: java math matrix random

我在一个项目上工作,对于这个项目,我需要生成一个方形随机可逆矩阵。

我发现了如何生成一个方形随机矩阵,我仍然想确定这是一个可逆矩阵,无需计算行列式或多次生成这个矩阵,你能给我一个提示吗? / p>

2 个答案:

答案 0 :(得分:3)

一种方法是生成矩阵的SVD。那就是你生成'随机'(正方形)正交矩阵U和V,以及一个'随机'对角矩阵S,然后计算

 M = U*S*V'

请注意,每个矩阵都有一个SVD

只要S的对角元素都不为0,M就是可逆的。处理可逆矩阵的许多例程对矩阵的条件数敏感;随着条件数量的增加,错误往往会增加。 M的条件数与S的条件数相同,S的条件数是S的最大(绝对值)对角线元素除以最小值(绝对值)。你可能想要控制它。一种方法是在[lo,hi]中生成S的元素,然后随机设置符号。

生成“随机”正交矩阵的一种方法是生成“随机”Householder反射的乘积,即形式的矩阵

R_v = 1 - 2*v*v'/(v'*v)

其中v是'随机'向量。 每个n乘n正交矩阵可以写成n个Householder反射的乘积。 所有这一切都不像它最初看起来那么严重。由于反射器的特殊形式,可以直接编写计算

的例程
R_u*M and M*R_v'
在M中仅使用n个额外存储并且为O(n * n)

所以一个方案就是

Generate S
Repeat n times
  Generate random non zero vector u 
  Update S to be R_u*S
  Generate random non zero vector v 
  Update S to be S*R_v'

答案 1 :(得分:0)

LU decomposition可能有用。

生成两个矩阵L,它是下三角形,主对角线零点以上的所有条目,U,上三角矩阵,主要对角线零下方有条目。然后形成矩阵A = LU。

L或U的行列式只是主对角线下方的条目的乘积,因此您只需确保这些都不为零。 A的决定因素是两个决定因素的乘积。