Matrices
The Matrix
data structure allows users to do linear algebra operations in Symbolica.
Construction
Matrices can be created through one of the following constructors:
from symbolica import *
= Matrix.identity(2)
i = Matrix.eye([1, 2, 3])
e = Matrix.from_linear(3, 2, [1, 2, 3, 4, 5, 6])
l = Matrix.from_nested([[1, 2, 3], [4, 5, 6]]) n
use symbolica::domains::integer::IntegerRing;
use symbolica::domains::rational::RationalField;
use symbolica::tensors::matrix::Matrix;
fn main() {
let i = Matrix::identity(2, IntegerRing::new());
let e = Matrix::identity(&[1.into(), 2.into(), 3.into()], IntegerRing::new());
let l = Matrix::from_linear(
vec![
1u64.into(),
2u64.into(),
3u64.into(),
4u64.into(),
5u64.into(),
6u64.into(),
,
]3,
2,
IntegerRing::new(),
).unwrap();
let n = Matrix::from_nested(
vec![
vec![1.into(), 2.into(), 3.into()],
vec![4.into(), 5.into(), 6.into()],
,
]IntegerRing::new(),
).unwrap();
}
yielding
i = {{1,0},{0,1}}
e = {{1,0,0},{0,2,0},{0,0,3}}
l = {{1,2},{3,4},{5,6}}
n = {{1,2,3},{4,5,6}}
Arithmetic
Matrices can be multiplied, added and subtracted using overloaded operators.
= Matrix.from_linear(3, 2, [1, 2, 3, 4, 5, 6])
l = Matrix.from_nested([[1, 2, 3], [4, 5, 6]])
n * n + Matrix.identity(3) l
let c = &l * &n + &Matrix::identity(3, IntegerRing::new());
yielding
{{10,12,15},{19,27,33},{29,40,52}}
In Rust, the type of argument of the matrix can be selected, e.g. Matrix<Rational>
. In Python, the default is a matrix over rational polynomials, i.e. Matrix<RationalPolynomial<Integer, u16>>
in Rust.
Common operations
For matrices over fields, determinants and inverses can be computed.
= Expression.symbol('t')
t
= Matrix.from_nested([[t, 2], [3, 4]])
a print('a =', a)
print('a^-1 =', a.inv())
print('det(a) =', a.det())
println!("a = {}", a);
println!("a^-1 = {}", a.inv().unwrap());
println!("det(a) = {}", a.det().unwrap());
which yields
a = {{t,2},{3,4}}
a^-1 = {{2/(-3+2*t),-3/(-6+4*t)},{-3/(-6+4*t),t/(-6+4*t)}}
det(a) = -6+4*t
The matrix equation \[\mathbf{A} \cdot \vec{x} = \vec{b}\] can be solved as well:
from symbolica import *
= Expression.symbol('t')
t
= Matrix.from_nested([[t, 2], [3, 4]])
a 4, 3])) a.solve(Matrix.vec([
let r = a.solve(&b).unwrap();
println!("{} . x = {} => x = {}", a, b, r);
which yields:
{{5/(-3+2*t)},{(-12+3*t)/(-6+4*t)}}
Matrices can also be indexed using a (row, column)
tuple, which yields the entry.