【问题标题】:Eigen decomposition in ScalaScala中的特征分解
【发布时间】:2015-07-09 09:15:49
【问题描述】:

我想在 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))。

谢谢!

【问题讨论】:

    标签: scala breeze linear-algebra


    【解决方案1】:

    第一个问题是eigSymEigSym不一样。 eigSym 是一个对象,它有一个接受DenseMatrixapply 方法,所以我们可以写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 解构案例类并定义分配给EigSym 的两个成员的新lambdaevs 变量。你也可以这样写:

    val es = eigSym(A)
    val lambda = es.eigenvalues
    val evs = es.eigenvectors
    

    这个是等价的,只不过它还定义了一个es变量,而且有点吵和冗长。

    更一般地,如果X 对象有一个unapply 方法,该方法接受正确类型的参数(然后X 在Scala 中有时称为“提取器”),则val X(a, b, c) = ... 语法有效。 Scala 案例类有一个由编译器自动为它们生成的unapply 方法。

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

    【讨论】:

    • 很好的答案!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2015-05-26
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多