Eigen:如何检查矩阵是否可逆

3
我想使用Eigen生成一个随机可逆矩阵,满足以下条件:
Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> res(M, N + 1);
Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> y(M, 1);
y.setRandom();
while (true) {
    res.setRandom();
    Eigen::FullPivLU<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>> lu(res.transpose() * res);
    if (lu.isInvertible()) {
        break;
    }
}

因此,res^T*res应该是可逆的,但我需要一个随机的res


https://en.cppreference.com/w/cpp/numeric/random - Jesper Juhl
那怎么可能有所帮助呢?@JesperJuhl - Clebo Sevic
你想要一个随机的“东西”。那个链接告诉你如何在现代C++中生成随机数。因此,它应该通过展示如何生成随机数来帮助你生成你的随机东西。 - Jesper Juhl
修改了注释,现在应该更好地反映了我的问题。 - Clebo Sevic
你的实际问题是“如何创建随机的、满秩的、对称正定矩阵?”(或者是随机的、满秩的 Mx(N+1) 矩阵?) - chtz
1个回答

0

这比我在这里做的更快还是更慢? - Clebo Sevic
两者应该是相似的,都使用了LU分解技术。然而,在您的问题中,具有随机双精度(“实数”)系数的矩阵将以概率1具有完全秩,因此只要N + 1小于或等于M,乘积就是可逆的(几乎总是)。 - Juan Carlos Ramirez
好的,谢谢你的回答。问题是,当我设置这些矩阵时没有进行检查,经常会出现运行时错误,因为这些矩阵是奇异的...我忘了提到,结果中的第一列始终为1。 - Clebo Sevic
我认为你的问题可能出在随机分配条目时,尝试使用res.setRandom(M,N+1)来显式地使用矩阵随机设置器。为了调试,请选择足够小的M和N,以便您可以手动调试res;验证所有列是否线性无关。 - Juan Carlos Ramirez
检查行列式以确定矩阵是否可逆通常是一个不好的想法,因为行列式会呈指数级增长。例如,如果 det(A)==1,那么 det(s*A)==pow(s,A.rows())。使用 .isInvertible() 进行检查要好得多(但我认为这不是 OP 的实际问题)。 - chtz
@chtz编辑了我的答案。我怀疑在这种情况下,det仍然会很小,至少与从一个矩阵X ^ TX,X随机期望的值相比(det的绝对值将在高概率下约为const(N ^ N))。 - Juan Carlos Ramirez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接