Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的随机可逆矩阵_Java_Math_Matrix_Random - Fatal编程技术网

Java中的随机可逆矩阵

Java中的随机可逆矩阵,java,math,matrix,random,Java,Math,Matrix,Random,我在一个项目中工作,对于这个项目,我需要生成一个平方随机可逆矩阵 我发现了如何生成一个平方随机矩阵,但我想确定这是一个可逆矩阵,而不必计算行列式或多次生成该矩阵,你能给我一个提示吗?一种方法是生成矩阵的奇异值分解。即生成“随机”(平方)正交矩阵U和V,以及“随机”对角矩阵S,然后计算 M = U*S*V' 注意,每个矩阵都有一个奇异值分解 只要S的对角元素都不为0,M就可逆。许多处理可逆矩阵的例程对矩阵的条件数很敏感;随着条件数的增加,错误往往会增加。M的条件数与S的条件数相同,S的条件数是

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


我发现了如何生成一个平方随机矩阵,但我想确定这是一个可逆矩阵,而不必计算行列式或多次生成该矩阵,你能给我一个提示吗?

一种方法是生成矩阵的奇异值分解。即生成“随机”(平方)正交矩阵U和V,以及“随机”对角矩阵S,然后计算

 M = U*S*V'
注意,每个矩阵都有一个奇异值分解

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

生成“随机”正交矩阵的一种方法是生成“随机”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'
一个可能有效的方法

生成两个矩阵L,它是下三角矩阵,所有条目都位于主对角线零点之上,U是上三角矩阵,条目位于主对角线零点之下。然后形成一个矩阵a=LU


L或U的行列式只是主对角线上条目的乘积,所以你只需要确保它们都不是零。A的行列式是两个行列式的乘积

[x0;0x0;0x0]对于任何随机x(除0之外)都是可逆的。这是真的,但为了我的项目,我希望所有值都是随机的。如果您在这里没有得到答案,请尝试math.stackexchange.com,那些家伙擅长于
数学
标记。我会尝试一下。我会向你保证99%你生成的任何随机矩阵都是可逆的。