Code covered by the BSD License

### Highlights from TPROD -- arbitary tensor products between n-d arrays

5.0
5.0 | 9 ratings Rate this file 21 Downloads (last 30 days) File Size: 43.2 KB File ID: #16275 Version: 1.4

# TPROD -- arbitary tensor products between n-d arrays

### Jason Farquhar (view profile)

07 Sep 2007 (Updated )

TPROD -- efficiently allows any type of tensor product between 2 multi-dimensional arrays

File Information
Description

Multi-dimensional generalization of matrix multiplication

This function computes a generalized multi-dimensional matrix product based upon the einstein summation convention (plus extras). This means given 2 n-d inputs:
X = [ A x B x C x E .... ]
Y = [ D x F x G x H .... ]
we define the result, Z, to be (in ESC)
Z_{c,e,d,f} = X_{a,b,c,e} Y_{d,f,a,b}
(N.B. This syntax can be used directly with the etprod wrapper script).
This translates into tprod syntax as:
Z = tprod(X,[-1 -2 1 2],Y,[3 4 -1 -2])
N.B. if Y==[], then it is assumed to be a copy of X.
This result is produced by forming an inner-product (multiply+sum) for the pairs of dimensions which have the same (negative) label (i.e. -1 => X dim 1 and Y dim 3, and -2 => X dim 2 and Y dim 4) and forming an outer product for all the remaining dimensions, with the positive label determining where this dimension is placed in the output.

MATLAB release MATLAB 6.5 (R13)
Other requirements MEX compilation must work, hence needs a standard c compilier installed and performing correctly.
20 Jan 2015 malin cik

### malin cik (view profile)

It seems that tprod cannot handle large sparse matrices. If one passes the full matrix to tprod instead, it takes forever (in particular it becomes much slower than a simple matlab for-loop).

Is it possible to update it?

Also, there is a problem running tprod with the mac OS mex compiler (Xcode), as the definition and usage of the INLINE function has been changed in the last edition. Currently the two files mxInfo.h and tprod.h contain the piece of code:

/* check the compilier state to use the appropriate inline directive */
#ifdef __GNUC__ /* use the GNUC special form */
#define INLINE __inline__
#elif defined(__STDC__) && __STDC_VERSION__ >= 199901L /*C99 compat compilier*/
#define INLINE static inline
#else /* fall back on C89 version, i.e. *no inlines* */
#define INLINE
#endif

If one replaces it by

/* check the compilier state to use the appropriate inline directive */
#if defined(__STDC__) && __STDC_VERSION__ >= 199901L /*C99 compat compilier*/
#define INLINE static inline
#elif defined(__GNUC__) /* use the GNUC special form */
#define INLINE __inline__
#else /* fall back on C89 version, i.e. *no inlines* */
#define INLINE
#endif

then tprod works properly.

Comment only
24 Jan 2014 Mahdi

### Mahdi (view profile)

27 Sep 2013 Lennart

### Lennart (view profile)

Maybe some extra explanation about the syntax would help the people less known with Tensor Algebra like myself.

27 Sep 2013 Lennart

### Lennart (view profile)

Extremely useful, ridiculous that matlab cant do this normally. When your functions get single precision input more than half of the inbuilt tests fail by the way.

02 May 2012 Joao Hespanha

### Joao Hespanha (view profile)

Sounds great, but I get accuracy error in tprod_testcases:

****************
Double Real X, Single Real Y
******************
dRsR OuterProduct, [1],[2] = 5.96e-08 Passed
dRsR Inner product, [-1],[-1] = 3.76e-08 Passed
dRsR Matrix product, [1 -1],[-1 2] = 3.22e-06 Passed
dRsR transposed matrix product, [-1 1],[-1 2] = 3.56e-06 Passed
dRsR Matrix frobenius norm, [-1 -2],[-1 -2] = 6.94e-07 Passed
dRsR transposed matrix frobenius norm, [-1 -2],[-2 -1] = 7.48e-07 Passed
dRsR ignored dims, [0 -2],[-2 2 1] = 4.49e-06 Passed
dRsR spatio-temporal filter [-1 -2 1],[-1 -2] = 7.2e-05 **FAILED***

The above was from MATLAB 7.14.0.739 (R2012a), OSX Xcode 4.3. I've also tried it with MATLAB 7.13.0.564 (R2011b), OSX Xcode 4.3 and I also get an accuracy error, but at a different spot:

****************
Double Real X, Single Real Y
******************
dRsR OuterProduct, [1],[2] = 5.96e-08 Passed
dRsR Inner product, [-1],[-1] = 2.88e-07 Passed
dRsR Matrix product, [1 -1],[-1 2] = 2.94e-06 Passed
dRsR transposed matrix product, [-1 1],[-1 2] = 3.55e-06 Passed
dRsR Matrix frobenius norm, [-1 -2],[-1 -2] = 3.65e-05 **FAILED***
Warning: dRsR Matrix frobenius norm, [-1 -2],[-1 -2]: failed!

Comment only
11 Apr 2012 Christophe Lauwerys

### Christophe Lauwerys (view profile)

Great tool, thanks. (how) would it be possible to create a simulink block with this functionality?

Comment only
23 Aug 2011 Fangjun Jiang

### Fangjun Jiang (view profile)

Please consider re-writing the help text to better explain the syntax. Some examples provided cause syntax error. See the link:

Comment only
17 Mar 2011 Mark

### Mark (view profile)

Those interested in tensor operations may also be interested in the Tensor Toolbox from Sandia National Labs:

http://csmr.ca.sandia.gov/~tgkolda/TensorToolbox/

Comment only
15 Dec 2010 Steven

### Steven (view profile)

Invaluable and has become a constantly utilized function for image processing. Have you thought about adding GPU capability?

11 Jul 2010 Stephan Poppe

### Stephan Poppe (view profile)

05 Mar 2010 Juliette Salexa

### Juliette Salexa (view profile)

How is the speed of this code, in comparison to unfolding the tensors manually into matrix-vector form, and then doing the multiplication with matlab ?

Comment only
27 Aug 2009 Ira ekhaus

### Ira ekhaus (view profile)

Hi Again,
I contacted the author and he was fast&accurate at helping to get going with a new TPROD rev that works with matlab's internal lcc compiler.

Excellent!

Comment only
26 Aug 2009 Ira ekhaus

### Ira ekhaus (view profile)

Has anyone successfully run this package with matlab R2007b ?

Thx

Comment only
29 Oct 2008 Christian Walder

### Christian Walder (view profile)

Brilliant! I couldn't do without this code. By the way it is very stable and easy to use (once you get the hang of it).

27 Jun 2008 Carl Rasmussen

The 2008-06-26 version works flawlessly. Thank you Jason for writing this. Disgraceful that mathworks don't provide even something as simple as a multidimensional product...

04 Mar 2008 marc deisenroth

excellent code, easy to use (especially after adding the etprod wrapper). cool stuff!

24 Jan 2008 Timothy Wilson

This package highlights an area where MATLAB falls short: multiplying high order tensors.
The code is well optimised and simple to use compared with other similar packages.
The input is based on Einstien Summation therefore easily accessble to anyone working with high rank tensors.

19 Sep 2007

Updated description to reflect functions actual operation

21 Sep 2007

Fixed a bug in the processing of mixed complex/real products

18 Jan 2008

Fixed a bug when using mixed complex/real inputs. Also updates to the test-case code.

19 Feb 2008

Fixed a bug when result causes out of memory errors.
Updated calling syntax to be more like try ESC.
Added a new m-file wrapper, etprod, which makes tprod calls look much more like ESC.
Added support for single and mixed single/double matrices

12 Jun 2008

Bug Fix -- fixed a memory management bug when using mixed double/single inputs

23 Jun 2008

Bug fix

01 Nov 2008 1.1

Bug fixes -- 1) problem with certain unusual calling orders.
2) compilation with lcc

27 Aug 2009 1.2

Updated to work with very restrictive C dialects (such as LCC's) -- particularly when used on windows.

25 Apr 2010 1.3

(Another) fix to make it compile with pedantic c-compilers, e.g. lcc.

09 Mar 2012 1.4

Updated the examples in tprod.m to show the equlivalent matlab code, and to include more complex examples