2015-07-09 3 views
2

Я хочу рассчитать собственные значения и собственные векторы положительной полуопределенной матрицы в Scala (используя Бриз), и я застрял.Собственное разложение в Scala

Из 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) 

Прежде всего в моей программе А является матрицей ковариации:

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 (лямбда, evs)» с левой стороны (я новичок в Scala и ожидаю только (лямбда, evs)).

Спасибо!

ответ

6

Первая проблема заключается в том, что eigSym и EigSym различны. eigSym - это объект, который имеет метод apply, который принимает DenseMatrix, поэтому мы можем написать eigSym(A), который является синтаксическим сахаром (предоставляется Scala-it не для Breeze) для eigSym.apply(A).

Так следующее будет работать:

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) 

часть использует тот факт, что 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 метод, который принимает аргументы правых типов (и X затем иногда называют «экстрактор» в Scala). Классы классов Scala имеют метод unapply, автоматически создаваемый для них компилятором.

Это много синтаксического сахара, и вполне разумно использовать более подробную форму назначения - просто помните, что если вы видите такой синтаксис в коде других людей, вы должны либо искать определение класса case или метод unapply, если вы хотите выяснить, что происходит.

+0

Отличный ответ! Благодарю. – Alt