矩阵是正定的吗?


19

介绍

今天我们要照顾第一年线性代数学生的祸根:矩阵定性!显然这还没有挑战,所以我们开始:

输入项

  • 任何方便格式的n×n 对称矩阵A(当然,您也可以只取矩阵的上部或下部)
  • 可选:矩阵的大小n

该怎么办?

挑战很简单:给定一个实值矩阵n×n矩阵,如果输出真值,则输出真值,否则输出假值,从而确定其是否为正定值。

您可能会假定内置程序能够真正正确地工作,因此不必考虑数值问题,如果“可证明”的策略/代码产生正确的结果,则可能导致错误的行为。

谁赢?

这是,因此以字节(每个语言)为单位的最短代码为准!


反正矩阵是什么?

当对称矩阵为正定时,显然有6个等价公式。我将重现这三个简单的文章,并为更复杂的文章引用Wikipedia

  • 如果vRn{0}:vTAv>0A是正定的。
    可以将其重新公式化为:
    如果对于每个非零向量vvAv的(标准)点积为正,则A为正定。
  • λii{1,,n}特征值A,如果现在i{1,,n}:λi>0(这是所有本征值是正的),然后A是正定的。
    如果您不知道特征值是什么,我建议您使用自己喜欢的搜索引擎进行查找,因为本文中的解释(以及所需的计算策略)太长了。
  • 如果乔列斯基分解A存在,即存在一个下三角矩阵L使得LLT=A然后A是正定的。请注意,如果在任何时候由于负参数导致算法期间根的计算失败,则这等效于提早返回“ false”。

例子

为真实输出

(100010001)

(1000020000300004)

(521211113)

(1222502030)

(7.152.452.459.37)

虚假输出

(至少一个特征值是0 /正半定)

(322240202)

(特征值具有不同的符号/不确定)

(100010001)

(所有特征值均小于0 /负定数)

(100010001)

(所有特征值小于0 /负定的)

(230350001)

(所有特征值小于0 /负定的)

(7.152.452.459.37)

(三个正,一个负特征值/不确定)

(7.152.451.233.52.459.372.713.141.232.7106.23.53.146.20.56)



您需要为我们应该寻找的内容提供更好的定义,而不是假设我们都可以阅读数学符号(或都知道“特征值”是什么)。一个可行的示例也将很有用。
粗野的

9
@Shaggy我认为在没有所有背景的情况下挑战会更好。关于特征值在其他地方有很多现有的解释,并且这篇文章已经非常大了。
小麦巫师

1
如果您不将输入限制为对称矩阵,那么挑战本来会更好。
polfosolఠ_ఠ18年

1
我的意思是仅仅检查特征值的符号也很无聊。我知道不同的口味;)
polfosolఠ_ఠ

Answers:


11

C,108字节

-1字节归因于Logern
-3字节归因于ceilingcat

f(M,n,i)double**M;{for(i=n*n;i--;)M[i/n][i%n]-=M[n][i%n]*M[i/n][n]/M[n][n];return M[n][n]>0&(!n||f(M,n-1));}

在线尝试!

执行高斯消除,并检查所有对角元素是否均为正(Sylvester准则)。参数n是矩阵的大小减一。


也许用float而不是double保存一个字符?
詹斯


如果i=0放入for循环,则可以剃除另一个字符,进行递归调用f(M,n-1,0)和将0作为第三个参数的初始调用。
詹斯

@Jens 1.使用浮点数而不是双精度数会迅速导致明显的舍入错误,因此我认为保存一个字节不值得。2.通过附加参数初始化变量对我来说似乎很欺骗。
nwellnhof

@Logern我拒绝在我的C答案中使用“省略return语句”技巧。但是,感谢您节省了其他字节。
nwellnhof

9

MATLAB / Octave19 17 12字节

@(A)eig(A)>0

在线尝试!

函数eig按升序提供特征值,因此,如果第一个特征值大于零,则其他特征值也是如此。


您可以f=在一开始就删除-匿名函数通常被视为答案。
Delfad0r

谢谢你的提示!
Daniel Turizo

即使它是向量?有趣
Daniel Turizo

1
+1。我添加了一个在线尝试链接。希望你不要介意。请注意,这也证明了根据数组@ Delfad0r,尽管是数组,但输出值确实算作正确的“真实”或“假”值。
汤姆·卡彭特

2
话虽如此,它在TIO上的第一个“假”测试用例中失败了。我猜由于精度问题-本征值中的一个出来的8.9219e-17,而不是0
汤姆·卡彭特

7

果冻11 10字节

ṖṖ€$ƬÆḊṂ>0

使用Sylvester的标准

在线尝试!

怎么运行的

ṖṖ€$ƬÆḊṂ>0  Main link. Argument: M (matrix)

   $Ƭ       Do the following until a fixed point is encountered.
Ṗ             Pop; remove the last row of the matrix.
 Ṗ€           Pop each; remove the last entry of each row.
     ÆḊ     Take the determinants of the resulting minors.
       Ṃ    Take the minimum.
        >0  Test if the least determinant is positive, i.e., if all determinants are.


6

Haskell,56个字节

f((x:y):z)=x>0&&f[zipWith(-)v$map(u/x*)y|u:v<-z]
f[]=1>0

在线尝试!

基本上是nwellnhof的答案。执行高斯消除,并检查主对角线上的元素是否为正。

由于舍入误差而使第一个虚假输出失败,但是理论上它将以无限的精度工作。多亏了Curtis Bechtel的建议,现在所有输出都是正确的。


2
您可以添加inputs :: [[[Rational]]]以获得正确的答案
Curtis Bechtel

4

Wolfram语言(Mathematica),20个字节

0<Min@Eigenvalues@#&

在线尝试!


第四个测试用例应该为False吗?
tsh

@tsh固定,我很笨!
Xcoder先生18年

8
有趣的是Mathematica对此具有内置功能,但其名称比您的解决方案长。
Federico Poloni

@FedericoPoloni:使用NullSpace或MatrixRank的解决方案会更短吗?如果Null空间为零,则矩阵为正定。
菲尔H

@PhilH不,恐怕这本身并不起作用。例如,第二个虚假示例(具有(1,-1,1)的对角矩阵)的等级为3,但不是正定的。
Federico Poloni




2

MATL,6个字节

可以使用更少的字节@Mr来实现。Xcoder设法找到一个5字节的MATL答案

YvX<0>

说明

Yv     compute eigenvalues
  X<   take the minimum
    0> check whether it is greather than zero

在线尝试!


在第一个虚假的测试用例上失败。查看我已删除的答案
Xcoder先生18年

1
@ Mr.Xcoder哦,您甚至还向我提交了一个答案。我认为您应该取消删除答案,因为这仅取决于取整问题。(我认为您可以期待使用有限精度算术的答案-我认为这里只有CAS语言使用的是精确计算。)
瑕疵的

按照您的建议,我未删除它
Xcoder先生18年

1

枫树,33字节

(即我的2美分)

with(LinearAlgebra):
IsDefinite(A)

您好,欢迎来到PPCG;我不熟悉Maple,但是换行符是必需的吗?
乔纳森·弗雷希

@JonathanFrech您好,谢谢。不,这不对。我没有算过。
polfosolఠ_ఠ18年

对我来说,您当前的字节数似乎反映了换行符。
乔纳森·弗雷希

@JonathanFrech咄,我的坏
polfosolఠ_ఠ

1
好吧...现在您的代码和字节数不一致。
乔纳森·弗雷希

0

JavaScript(ES6), 99 95  88字节

01

f=(m,n=0,R=m[n])=>R?f(m,n+1)&R[m.map((r,y)=>y<n&&R.map((v,x)=>r[x]-=v*r[n]/R[n])),n]>0:1

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.