어떻게 scala breeze에서 행렬의 선형 시스템을 풀 수 있습니까? 즉, Ax = b, A는 행렬 (일반적으로 양의 한정)이고 x와 b는 벡터입니다.scala breeze에서 행렬의 선형 시스템을 푸는 방법은 무엇입니까?
내가 볼 수있는 콜레 스키 분해가 가능하지만 솔버를 찾을 수없는 것 같습니다. (내가 x = b \ A. 할 수있는 matlab 경우 x = A.solve (b) 할 수있는 scipy 경우)
어떻게 scala breeze에서 행렬의 선형 시스템을 풀 수 있습니까? 즉, Ax = b, A는 행렬 (일반적으로 양의 한정)이고 x와 b는 벡터입니다.scala breeze에서 행렬의 선형 시스템을 푸는 방법은 무엇입니까?
내가 볼 수있는 콜레 스키 분해가 가능하지만 솔버를 찾을 수없는 것 같습니다. (내가 x = b \ A. 할 수있는 matlab 경우 x = A.solve (b) 할 수있는 scipy 경우)
분명히, 그것은 사실 매우 간단하고, 연산자로 스칼라 - 바람에 내장 :
x = A \ b
그것은 콜레을 사용 나던, 그것은 LU 분해를 사용하여, 나는 반에 대해 생각하다 빨리,하지만 그들은 모두 O (n^3), 그래서 비교할 수 있습니다.
글쎄, 결국 내 자신의 해결사를 썼습니다. 이것이 최선의 방법인지 확실하지 않지만 부당하게 보지 않습니까? :
// Copyright Hugh Perkins 2012
// You can use this under the terms of the Apache Public License 2.0
// http://www.apache.org/licenses/LICENSE-2.0
package root
import breeze.linalg._
object Solver {
// solve Ax = b, for x, where A = choleskyMatrix * choleskyMatrix.t
// choleskyMatrix should be lower triangular
def solve(choleskyMatrix: DenseMatrix[Double], b: DenseVector[Double]) : DenseVector[Double] = {
val C = choleskyMatrix
val size = C.rows
if(C.rows != C.cols) {
// throw exception or something
}
if(b.length != size) {
// throw exception or something
}
// first we solve C * y = b
// (then we will solve C.t * x = y)
val y = DenseVector.zeros[Double](size)
// now we just work our way down from the top of the lower triangular matrix
for(i <- 0 until size) {
var sum = 0.
for(j <- 0 until i) {
sum += C(i,j) * y(j)
}
y(i) = (b(i) - sum)/C(i,i)
}
// now calculate x
val x = DenseVector.zeros[Double](size)
val Ct = C.t
// work up from bottom this time
for(i <- size -1 to 0 by -1) {
var sum = 0.
for(j <- i + 1 until size) {
sum += Ct(i,j) * x(j)
}
x(i) = (y(i) - sum)/Ct(i,i)
}
x
}
}