Add 'matrix' function

This commit is contained in:
PaddiM8 2022-06-02 23:37:12 +02:00
parent cf6dc88fc0
commit bcb8b3e4c2

View File

@ -109,6 +109,7 @@ lazy_static! {
let mut m = HashMap::new();
m.insert("average", VectorFuncInfo(average, Other));
m.insert("diag", VectorFuncInfo(diag, Other));
m.insert("matrix", VectorFuncInfo(matrix, Other));
m.insert("max", VectorFuncInfo(max, Other));
m.insert("min", VectorFuncInfo(min, Other));
m.insert("perms", VectorFuncInfo(perms, Other));
@ -760,6 +761,28 @@ pub mod funcs {
})
}
pub fn matrix(x: KalkValue) -> Result<KalkValue, KalkError> {
let rows = as_vector_or_return!(x);
let column_width =
if let KalkValue::Vector(first_vec) = rows.first().unwrap_or(&KalkValue::nan()) {
first_vec.len()
} else {
0
};
let mut columns = Vec::new();
for value in rows {
let column = as_vector_or_return!(value);
if column.len() != column_width {
return Err(KalkError::InconsistentColumnWidths);
}
columns.push(column);
}
Ok(KalkValue::Matrix(columns))
}
pub fn max(x: KalkValue) -> Result<KalkValue, KalkError> {
let values = as_vector_or_return!(x);
let mut max = &values[0];