mathnet-symbolics icon indicating copy to clipboard operation
mathnet-symbolics copied to clipboard

Matrix math

Open ericremoreynolds opened this issue 11 years ago • 5 comments

Hello Christoph,

From your source code it seems to me that there is no support for matrix algebra and calculus in the library, is this correct?

Introducing matrix algebra is a pain, I have found, because all of a sudden some product expressions are commutative and others aren't.

Regards,

Eric.

ericremoreynolds avatar Jun 23 '14 12:06 ericremoreynolds

Indeed, there is no support for matrix expressions. There was in old Math.NET Classic, but not in Symbolics yet.

cdrnet avatar Feb 15 '15 08:02 cdrnet

I would skip matrices completely and go for tensors (#14) instead.

This would make sense since scalars, vectors, and matrices are just a special kind of tensors.

MovGP0 avatar Sep 01 '16 15:09 MovGP0

the lack for matrices and tensors is annoying. it is currently not possible to solve system of equations symbolically:

let burger = symbol "burger"
let pommes = symbol "pommes"
let coke = symbol "coke"
let bill = symbol "bill"

let equations = [
        (2*coke) == 30.0
        (1*coke + 2*burger) == 20.0 // equals does not exist
        (1*burger + 4*pommes) == 9.0
        (burger + pommes * coke) == bill
    ]

linSolve equations bill // not working

the only way i could figure out was the numerical solution:

let M = matrix [[3.0; 0.0; 0.0]
                [1.0; 2.0; 0.0]
                [0.0; 1.0; 4.0]]

let R = vector [30.0; 20.0; 9.0]

let result = M.Solve(R)

let coke = result.[0]
let burger = result.[1]
let pommes = result.[2]

burger + pommes * coke // 15

maybe we could port Redberry (Sourcecode), since it has great support for tensors.

MovGP0 avatar Nov 11 '17 15:11 MovGP0

Matrix multiplication supported with an ugly way

    let v = FloatingPoint.RealVector <| vector[1.0;2.0;3.0]

    let M = FloatingPoint.RealMatrix <|
            matrix [[3.0; 0.0; 0.0]
                        [1.0; 2.0; 0.0]
                        [0.0; 1.0; 4.0]]

    let symbols2 = dict[ "a", v; "m", M ]
    let a0 = SymbolicExpression(Infix.parseOrThrow("a * 2")).Evaluate(symbols2)
    printfn "%A" a0.RealVectorValue
    let a1 = SymbolicExpression(Infix.parseOrThrow("a + 1")).Evaluate(symbols2)
    printfn "%A" a1.RealVectorValue
    let a2 = SymbolicExpression(Infix.parseOrThrow("mat_by_row(a, a)")).Evaluate(symbols2)
    printfn "%A" a2.RealMatrixValue
    let a4 = SymbolicExpression(Infix.parseOrThrow("mat_multiply(m, mat_by_col(a, vec(1.0, 2.0, 3.0), a), a)")).Evaluate(symbols2)
    printfn "%A" a4

Result

seq [2.0; 4.0; 6.0]
seq [2.0; 3.0; 4.0]
DenseMatrix 2x3-Double
1  2  3
1  2  3

DenseMatrix 3x2-Double
1  1
2  2
3  3

RealVector (seq [9.0; 13.0; 61.0])

ingted avatar Feb 28 '22 09:02 ingted