我想计算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))。
谢谢!
最佳答案
第一个问题是eigSym
和EigSym
不同。 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) = ...
部分使用以下事实:EigSym
是a case class,并且eigSym
返回EigSym
。定义左侧的EigSym
解构case类,并定义了新的lambda
和evs
变量,这些变量已分配给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/