class DiagMatrix[Vec, S](val diagonalVector: Vec)(implicit evidence: Vec <:< Vector[S]) extends Matrix [S]
(The evidence implicit is because you can't write class DiagMatrix[Vec <: Vector[S], S] and expect it to work. Why? because it's apparently too hard to implement.) You would probably want type aliases like
type DenseDiagMatrix[S] = DiagMatrix[DenseVector[S], S]