我正在尝试生成一些非常大的数组,并且至少有一个数组最终是单数的,这可以通过这个熟悉的错误消息显而易见:
File "C:\Anaconda3\lib\site-packages\numpy\linalg\linalg.py", line 90, in _raise_linalgerror_singular
raise LinAlgError("Singular matrix")
LinAlgError: Singular matrix
当然我不希望我的数组是单数的,但我更感兴趣的是确定为什么我的数组是奇异的。我的意思是,我希望有一种方法可以回答以下问题而无需手动检查每个条目:
阵列正方形? (我相信这是由一个单独的错误消息返回的,这很方便,但无论如何我都将此作为一个奇点属性包含在内)
是否仅使用零填充任何行?
是否只有零填充列?
是否有任何行与所有其他行不是线性独立的?
对于相对较小的阵列,前两个条件很容易通过目视检查来回答。但是,因为我的数组非常大,所以我不想进入并手动检查每个数组元素以查看是否满足任何条件。
我尝试拉起linalg.py
脚本,看看我是否能看到它如何确定矩阵是单数的,但我无法确定它是如何确定矩阵是单数的。
(为了清晰起见,编辑了这一段) 我也尝试在网上搜索信息,似乎没有任何帮助。大多数主题似乎只回答了以下问题/目标的某些形式:1)"我希望Python告诉我我的矩阵是否是单数"或者2)为什么Python会给我这个错误消息"。因为我已经知道我的矩阵/矩阵是单数的,所以这两个问题对我来说都不重要。
同样,我不是在寻找答案,而且,#34;哦,这个特殊的矩阵是单数的,因为。 。 &#34 ;.我正在寻找一种方法,我可以立即在任何奇异矩阵上使用,以确定(特别是对于大型数组)导致奇点的原因。
是否有内置的Python函数可以执行此操作,或者在我尝试创建一个可以为我执行此操作的函数之前还有其他一些相对简单的方法吗?
答案 0 :(得分:1)
奇异矩阵至少有一个等于零的特征值。您可以通过从其特征值分解开始创建可对角化的奇异矩阵:
A = V D V^{-1}
D是特征值的对角矩阵。因此,创建任何矩阵V,对角矩阵D在对角线中至少有一个零,然后A将是单数。
答案 1 :(得分:0)
传统的检查方式是计算SVD。这是函数numpy.linalg.matrix_rank
用于计算排名的函数,然后您可以检查matrix_rank(M) == M.shape[0]
(假设是矩阵)。
有关详细信息,请查看此excellent answer以查找Matlab用户的类似问题。
矩阵的等级将告诉您有多少行不是零或线性组合,而不是具体哪些行。这是一个相对较快的操作,因此它可能作为首次检查有用。