我想计算Scala中正半定矩阵的特征值和特征向量(使用Breeze),我陷入了困境。

来自Breeze线性代数库参考示例:

val A = DenseMatrix((9.0,0.0,0.0),(0.0,82.0,0.0),(0.0,0.0,25.0))
val EigSym(lambda, evs) = eigSym(A)

首先在程序A中是一个协方差矩阵:
val EigSym(lambda,evs)=EigSym(cov)

并且出现以下错误:
Error:(120, 34) not enough arguments for method apply: (eigenvalues: V, eigenvectors: M)breeze.linalg.eigSym.EigSym[V,M] in object EigSym.
Unspecified value parameter eigenvectors.
    val EigSym(lambda,evs)=EigSym(cov)
                                 ^

另一个论点应该是什么?

其次,任何人都可以为我解释为什么我们在左侧需要“EigSym(lambda,evs)”(我是Scala的新手,仅期望(lambda,evs))。

谢谢!

最佳答案

第一个问题是eigSymEigSym不同。 eigSym是一个具有apply方法的对象,该方法接受DenseMatrix,因此我们可以编写eigSym(A),它是eigSym.apply(A)的语法糖(由Scala提供,不是Breeze特有的)。

因此,以下将起作用:

import breeze.linalg._, eigSym.EigSym

val A = DenseMatrix((9.0,0.0,0.0),(0.0,82.0,0.0),(0.0,0.0,25.0))
val EigSym(lambda, evs) = eigSym(A)
val EigSym(lambda, evs) = ...部分使用以下事实:EigSyma case class,并且eigSym返回EigSym。定义左侧的EigSym解构case类,并定义了新的lambdaevs变量,这些变量已分配给EigSym的两个成员。您还可以编写以下内容:
val es = eigSym(A)
val lambda = es.eigenvalues
val evs = es.eigenvectors

这是等效的,除了它还定义了es变量,并且它有点嘈杂和冗长。

更一般而言,如果val X(a, b, c) = ...对象具有采用正确类型的参数的X方法,则unapply语法有效(然后在Scala中有时将X称为“提取器”)。 Scala case类具有由编译器自动为其生成的unapply方法。

不过,这有很多语法上的意义,并且使用更冗长的赋值形式是完全合理的—请记住,如果您在其他人的代码中看到了这种语法,则应该寻找案例类定义或unapply方法如果您想弄清楚发生了什么。

关于scala - Scala中的本征分解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31306083/

10-10 19:46