///|
/// Small dense matrix type used for low-dimensional covariance diagnostics.
pub struct SquareMatrix {
size : Int
data : Array[Double]
}
///|
pub fn SquareMatrix::new(size : Int, fill? : Double = 0.0) -> SquareMatrix {
let safe_size = if size < 1 { 1 } else { size }
{ size: safe_size, data: Array::make(safe_size * safe_size, fill) }
}
///|
pub fn SquareMatrix::identity(size : Int) -> SquareMatrix {
let matrix = SquareMatrix::new(size)
for i in 0.. Int {
self.size
}
///|
pub fn SquareMatrix::get(
self : SquareMatrix,
row : Int,
column : Int,
) -> Double {
if row < 0 || column < 0 || row >= self.size || column >= self.size {
0.0
} else {
self.data[row * self.size + column]
}
}
///|
pub fn SquareMatrix::set(
self : SquareMatrix,
row : Int,
column : Int,
value : Double,
) -> Unit {
if row >= 0 && column >= 0 && row < self.size && column < self.size {
self.data[row * self.size + column] = value
}
}
///|
pub fn SquareMatrix::diagonal(self : SquareMatrix) -> Array[Double] {
let result : Array[Double] = []
for i in 0.. SquareMatrix {
let result = SquareMatrix::new(self.size)
for row in 0.. SquareMatrix {
let size = if self.size < other.size { self.size } else { other.size }
let result = SquareMatrix::new(size)
for row in 0.. SquareMatrix {
let result = SquareMatrix::new(self.size)
for row in 0.. SquareMatrix {
let size = if self.size < other.size { self.size } else { other.size }
let result = SquareMatrix::new(size)
for row in 0.. Double {
let size = if vector.length() < self.size {
vector.length()
} else {
self.size
}
let mut result = 0.0
for row in 0.. Unit {
for i in 0.. Double {
if self.size == 1 {
self.get(0, 0)
} else if self.size == 2 {
self.get(0, 0) * self.get(1, 1) - self.get(0, 1) * self.get(1, 0)
} else {
let mut determinant = 0.0
for column in 0.. Double {
let size = if vector.length() < means.length() {
vector.length()
} else {
means.length()
}
let mut total = 0.0
for i in 0..