スカラーブリーズの行列の線形システムを解く方法はありますか?すなわち、私はAx = bを持ちます。ここで、Aは行列(通常は正定値)であり、xとbはベクトルです。スカラーブリーズの行列の線形システムを解くにはどうすればいいですか?
コレスキー分解があることがわかりますが、ソルバーを見つけることができませんでしたか? (私がx = b \ Aを行うことができるmatlabだったらx = A.solve(b)を行うことができた)scipyだった場合
スカラーブリーズの行列の線形システムを解く方法はありますか?すなわち、私はAx = bを持ちます。ここで、Aは行列(通常は正定値)であり、xとbはベクトルです。スカラーブリーズの行列の線形システムを解くにはどうすればいいですか?
コレスキー分解があることがわかりますが、ソルバーを見つけることができませんでしたか? (私がx = b \ Aを行うことができるmatlabだったらx = A.solve(b)を行うことができた)scipyだった場合
どうやら、それは実際には非常に簡単で、オペレータとしてのScala - そよ風に組み込ま:
x = A \ b
それはコレを使っdoesntのは、それが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
}
}