gpt4 book ai didi

scala - Scala 中的特征分解

转载 作者:行者123 更新时间:2023-12-01 16:23:19 27 4
gpt4 key购买 nike

我想在 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 解构案例类并定义分配给 的新 lambdaevs 变量EigSym 的两个成员。您还可以编写以下内容:

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

这是等价的,除了它还定义了一个 es 变量,而且它有点嘈杂和冗长。

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com