C++ 计算C+中矩阵秩的最快方法/库是什么+;

C++ 计算C+中矩阵秩的最快方法/库是什么+;,c++,windows,linear-algebra,sparse-matrix,C++,Windows,Linear Algebra,Sparse Matrix,哪个库计算矩阵的秩最快?或者,有没有公开的代码可以相当快地实现这一点 我使用的是Eigen3,它似乎比Python的numpy rank函数慢。我只需要这一个功能是快速的,绝对没有其他问题。如果你建议一个软件包,那么这一切都无关紧要,包括易用性 我正在查看的矩阵的大小往往是n乘(n选择3),条目是1或0…大部分是0 谢谢 编辑1:排名超过R。一般来说,函数速度惊人。建议使用GESVD或GESDD函数计算奇异值。非零奇异值的数量将是矩阵的秩 拉帕克是 简而言之,您可以使用相同的LAPACK库调用。

哪个库计算矩阵的秩最快?或者,有没有公开的代码可以相当快地实现这一点

我使用的是Eigen3,它似乎比Python的numpy rank函数慢。我只需要这一个功能是快速的,绝对没有其他问题。如果你建议一个软件包,那么这一切都无关紧要,包括易用性

我正在查看的矩阵的大小往往是n乘(n选择3),条目是1或0…大部分是0

谢谢

编辑1:排名超过R。

一般来说,函数速度惊人。建议使用
GESVD
GESDD
函数计算奇异值。非零奇异值的数量将是矩阵的秩

拉帕克是

简而言之,您可以使用相同的LAPACK库调用。除非稀疏性和特殊结构允许更有效的方法,否则很难超越BLAS/LAPACK函数。如果这是真的,那么您可能需要查看其他实现稀疏SVD解算器的库

注意还有多个BLAS/LAPACK实现

更新
似乎认为LU分解对于计算秩是不可靠的。最好做SVD。在经历使用BLAS/LAPACK的所有麻烦之前,您可能想看看eigen调用的速度有多快(我从来没有使用过eigen)。

您是否关心算法是随机的,但在终止时总是正确的,或者即使它是随机的,并且有可能出错?我不明白。我只关心速度。如果你能容忍0.0001%的失败概率,根据这篇论文,你应该能够在矩阵大小的线性时间内完成,使用他们的第一个结果(第2页)编辑:(3)结果应该对你做同样的事情,我想,这可能更难实现,但我不确定。关键是,如果您让n乘n选择3个大小,那么本文中的值
n^{w}
在这些表达式中可以忽略不计,因为
w<3
。我不知道这些在实践中是如何做到的,但在理论上我想它们是最优的。@ChrisBeck你应该把它们贴出来作为答案。。。即使OP不喜欢它,其他的可能在5到12之间。所有列都有3个1,其余的0。我强烈怀疑,对于0和1的稀疏矩阵这一非常特殊的情况,应该可以编写比将矩阵视为常规矩阵而不考虑其内容快得多的自制代码。@iwillnotexistidotexist是的,这取决于稀疏程度,什么是
n
,如果稀疏性有什么特殊的结构。我仍然不会完全自制,因为稀疏SVD是一个活跃的研究领域。快速谷歌搜索可以找到一些软件包/库。@Iwillnotexistidnotexist有一个很好的观点,一个稀疏的解算器可能是最好的选择。我更关注的是元素的特定值为0或1;我认为根本不需要进行任何乘法来计算秩。您只需“以某种方式”对行进行元素级比较,并使用它们的元素级不等式从
n
线性独立行中找到
k
的子集。他可以在不更改库的情况下尝试一些稀疏选项(例如)