Dear subscribers,

my previous posting with the same subject had extra blank lines which made

it hard to read. The problem was due to a bad conversion, performed by the

LISTSERV software, from my HTML submission to the required plain text

version. I apologize for the inconvenience. Here is the correct version:

The MULTIPROD toolbox for the MATLAB programming language is freely

available on the following web server:

http://www.mathworks.com/matlabcentral/fileexchange/

FILE EXCHANGE CATHEGORY:

** - MATLAB Central >* File Exchange > Mathematics > Linear Algebra

TITLE:

** - Multiplying two N-D arrays of matrices, vectors or scalars

----------------------------------------------------------------

***** **************** MULTIPROD TOOLBOX

** Multiplying two N-D arrays of matrices, vectors or scalars

******* *************** By Paolo de Leva

----------------------------------------------------------------

KEYWORDS

N-D arrays, Multidimensional arrays, Matrix, Vector, Scalar, Product,

Multiplication, Inner product, Outer product, Matrix expansion,

Transposition.

SUMMARY

Any kind of multiple products between two block arrays of matrices, vectors

or scalars.

DESCRIPTION

MULTIPROD is a powerful generalization for N-D arrays of the MATLAB function

MTIMES and the matrix multiplication operator (*). While MTIMES works only

with 2-D arrays, MULTIPROD works also with multidimensional arrays.

Besides the element-wise multiplication operator (.*), MATLAB 7 includes

only two functions which can perform products between N-D arrays: DOT and

CROSS. However, these functions can only perform two kinds of product: the

dot product and the cross product, respectively. MULTIPROD can perform any

kind of linear algebraic and vectorial products, except for cross products:

1) Both outer and inner products between arrays of vectors

2) Arrays of scalars by arrays of scalars, vectors or matrices

3) Arrays of vectors by arrays of scalars, vectors or matrices

4) Arrays of matrices by arrays of scalars, vectors or matrices

Synthetically, it can be stated that, with MULTIPROD, the "matrix

laboratory" MATLAB evolves becoming ARRAYLAB, an "array laboratory".

Multidimensional arrays may contain matrices or vectors or even scalars

along one or two of their dimensions. For instance, a 2x5x6 array A contains

six 2x5 matrices along its first and second dimension. Thus, array A can be

described as a block array of matrices, and its size can be indicated as

follows: (2x5)x6.

Let's say that:

A is (2x5)x6

B is (5x3)x6

C is (2x3)x6

With MULTIPROD, the six matrices in A can be multiplied by the six matrices

in B in a single step:

C = MULTIPROD(A, B)

Any multidimensional array can be described as a block array. Here are a few

examples:

A is a 2x5x(6x3) array containing matrices along dim. 3 and 4

B is a 2x5x(3x4) array containing matrices along dim. 3 and 4

C is a 2x5x(1x1) array containing scalars* along dim. 3 and 4

D is a 2x5x(6)** array containing vectors* along dim. 3

E is a 2x5x(3)** array containing vectors* along dim. 3

F is a 2x5x(1)** array containing scalars* along dim. 3

For instance, MULTIPROD can:

- Multiply the 10 matrices in A by the 10 matrices, vectors or

* scalars occupying the same position in B, C, E, or F

- Multi-multiply D by A

- Multi-multiply the arrays of scalars C and F by any of the other arrays

- Perform multiple outer products between D and E

MULTIPROD has a broad field of potential applications. By calling MULTIPROD,

multiple geometrical transformations such as rotations or roto-translations

can be performed on large arrays of vectors in a single step and with no

loops. Multiple operations such as normalizing an array of vectors, or

finding their projection along the axes indicated by another array of

vectors can be performed easily, with no loops and with two or three rows of

code.

Sample functions performing some of these tasks by calling MULTIPROD or by

using parts of its code are included in the separate toolbox "Matlab Central

> File Exchange > Vector algebra for multidimensional arrays of vectors".

A sample function (LOC2LOC) performing a multiple roto-translation by

calling MULTIPROD is included in this package. This function uses 3-element

translation vectors and 3x3 rotation matrices. If you prefer to work with

homogeneous coordinates and 4x4 roto-translation matrices, you can obtain

the same result just by calling MULTIPROD twice.

If you have a single matrix R, and you want to multiply it by an array of

vectors MultiV, you need to use the function MATEXP to replicate R and

create an array of matrices MultiR which can be multi-multiplied by MultiV

with MULTIPROD:

MultiV2 = MULTIPROD(MultiR, MultiV, ...)

MATEXP is included in this package.

MULTIPROD calls, in some cases, the function MULTITRANSP, performing matrix

transpositions in arrays of matrices. I wrote it as a separate function

because I discovered it can be useful for several different purposes.

MULTITRANSP is included in this package.

The help text in the function was written with extreme care, and should be

enough for those who want to quickly understand and use the function.

Further information is given in a short manual, written in Adobe PDF format.

For those who want to understand the function code, a document written with

MS Word and explaining in detail and schematically the meaning of the

implemented syntaxes is included.

Since I wanted to be of service to as many people as possible, MULTIPROD

itself was written, debugged, refined and in several parts even optimized

for speed with extreme care. I hope it or a future version of it, modified

according to your suggestions, will be included in the next version of

MATLAB. The code ("testMULTIPROD.m") I used to test the function output is

included in this package.

Examples:

1) *If A is a 5x(6x3)x2 array,

* *and B is a 5x(3x4)x2 array,

* *C = MULTIPROD(A,B,[2 3]) is a 5x(6x4)x2 array.

2) *If A is a 5x(6x3)x2 array,

** and B is a 5x(1x1)x2 array,

** C = MULTIPROD(A,B,[2 3]) is a 5x(6x3)x2 array.

3) *If A is a 5x(6x3)x2 4-D array,

** and B is a **5x(3)x2 3-D array,

** C = MULTIPROD(A,B,[2 3],[2]) is a 5x(6)x2 3-D array.

4) If both A and B are 5x(6)x2 3-D arrays,

** C = MULTIPROD(A,B,[2 0],[0 2]) is a 5x(6x6)x2 4-D array.

-----------------------------------------------------------

With my kindest regards,

Paolo de Leva

Department of Human Movement and Sport Sciences

University Institute of Movement Science

Rome, ITALY