// SolveCholeskyVec finds the vector v that solves A * v = b where A is represented // by the Cholesky decomposition, placing the result in the receiver. func (v *Vector) SolveCholeskyVec(chol *Cholesky, b *Vector) error { n := chol.chol.mat.N vn := b.Len() if vn != n { panic(matrix.ErrShape) } v.reuseAs(n) if v != b { v.CopyVec(b) } blas64.Trsv(blas.Trans, chol.chol.mat, v.mat) blas64.Trsv(blas.NoTrans, chol.chol.mat, v.mat) if chol.cond > matrix.ConditionTolerance { return matrix.Condition(chol.cond) } return nil }
// SolveCholeskyVec finds the vector v that solves A * v = b where A = L * L^T or // A = U^T * U, and U or L are represented by t, placing the result in the // receiver. func (v *Vector) SolveCholeskyVec(t Triangular, b *Vector) { _, n := t.Dims() vn := b.Len() if vn != n { panic(ErrShape) } v.reuseAs(n) if v != b { v.CopyVec(b) } ta := getBlasTriangular(t) switch ta.Uplo { case blas.Upper: blas64.Trsv(blas.Trans, ta, v.mat) blas64.Trsv(blas.NoTrans, ta, v.mat) case blas.Lower: blas64.Trsv(blas.NoTrans, ta, v.mat) blas64.Trsv(blas.Trans, ta, v.mat) default: panic(badTriangle) } }