68

For instance, is there some way I can say "let A and B be arbitrary real $m\times n$ and $k\times m$ matrices, Simplify[Transpose[Transpose[A].Transpose[B]]]" and Mathematica would simplify it to B.A?

I know I can set A and B to be matrices containing symbols (e.g. A = Table[Subscript[a,i,j],{i,m},{j,n}]), but results can get quite messy if the problem is more complex than Transpose[Transpose[A].Transpose[B]]

EDIT: To answer @Searke and @Artes questions in the comments: I'm currently watching this Stanford online machine learning course. If you look at the lecture notes, pages 8-11, you see a some matrix calculations. I can follow these calculations with pen and paper, but I haven't found a way to derive e.g. this result from page 11 using Mathematica:

enter image description here

Niki Estner
  • 36,101
  • 3
  • 92
  • 152
  • 2
    Nope.

    The issue is that for a given symbol there is no way to say "Oh this symbol is a symmetric, real matrix."

    To the best of my knowledge, there is no package for this.

    – Searke Mar 20 '12 at 13:17
  • 1
    I would actually be very interested in hearing what people think such functionality should be able to do. Does some other software do this and how do they do it? – Searke Mar 20 '12 at 13:18
  • See related question: http://mathematica.stackexchange.com/questions/8/how-to-symbolically-do-matrix-block-inversion – Eli Lansey Oct 04 '12 at 11:16
  • 1
    What about this answer? http://mathematica.stackexchange.com/a/16378/1089 – chris Apr 20 '14 at 20:31
  • 2
    There's a MatrixD package that lets you differentiate matrix expressions -- https://mathematica.stackexchange.com/questions/138708/differentiating-functions-of-vectors-matrices/141237#141237 – Yaroslav Bulatov Apr 26 '17 at 19:49

4 Answers4

28

Initially, Mathematica is not designed for such abstract calculations.

But, Mathematica is a powerful programming language, so that one can add such functionality easily.

See the following examples in related area of differential geometry:

J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574
helen
  • 927
  • 1
  • 9
  • 10
19

Indeed this is a one liner in NCAlgebra:

<< NC`
<< NCAlgebra`
NCGrad[1/2 (x ** z - y)^T ** (x ** z - y), z]

which results in

-y^T ** x + z^T ** x^T ** x

Mauricio de Oliveira
  • 2,001
  • 13
  • 15
12

I am not sure, but maybe this software for Mathematica http://www.math.ucsd.edu/~ncalg/ could somehow help. The software is for a package called NCAlgebra developed by UC San Diego. I am not familiar with the detailed usage, but it claims to implement capability to study noncommutative inequalities, linear controls, and semidefinite programming within Mathmeatica.

Carl Morris
  • 445
  • 3
  • 14
Konstantin
  • 121
  • 1
  • 2
  • 4
    Hi Konstantin, welcome to Mathematica.SE. Can you add some information about the software here? When that link dies ("when", not "if") your answer becomes useless. – stevenvh Oct 03 '12 at 17:56
12

For the posted example, TensorReduce does the trick:

TensorReduce[
  Transpose[Transpose[A].Transpose[B]], 
  Assumptions -> {A ∈ Matrices[{m, n}], B ∈ Matrices[{k, m}]}
]
B.A
Greg Hurst
  • 35,921
  • 1
  • 90
  • 136