File Exchange

## Multidimensional matrix multiplication

version 1.2 (1.75 KB) by

The simple function performs fast matrix multiplication within multidimensional arrays.

Updated

mmat(A,B) performs matrix multiplication, where the 2D matrices are part of multidimensional arrays. It is equivalent to the Matlab built in mtimes function for 2D arrays. However it naturally extends the mtimes function, where the two input arrays can have arbitrary number of extra dimensions. For example:

A = [1 2;2 1];
B = [3 4; 1 2];

mmat(A,B) == mtimes(A,B)

However A and B can be expanded along the 3rd dimension:

A = repmat([1 2; 2 1],[1 1 5]);

C = mmat(A,B) can be also performed, C will contains:
C(:,:,1) = A(:,:,1)*B;
C(:,:,2) = A(:,:,2)*B; ...

In the above example B was expanded along the singleton dimensions to match the size of A for the multiplication.

In the above examples the matrix multiplication was performed along the first two dimensions of A and B. However when called:
mmat(A,B,dim)
then dim selects two dimensions from A and B along which the matrix multiplication should be performed.

For example:
dim = [1 2] - default value
dim = [2 3] - C(ii,:,:) = A(ii,:,:) * B(ii,:,:);

This function contains only simple Matlab script without for loops!
Thus it is clean, fast and no compiling needed!

Enjoy!

Jesse Knight

### Jesse Knight (view profile)

Can you confirm for which use cases this is faster? Or is it just more flexible and convenient?

Please see this example:

% Want A*B: expected size [500 70 300]
A = randn([500,40]);
B = randn([40,70,300]);
% Using mmat
tic;
C = mmat(A,B);
fprintf('mmat time: %.05f seconds\n',toc);
% Using loops
tic;
C = zeros([size(A,1),size(B,2),size(B,3)]);
for c = 1:size(B,3)
C(:,:,c) = A*B(:,:,d);
end;
fprintf('loop time: %.05f seconds\n',toc);
% Workstation: MATLAB R2011a, Win-10-64, i7(4GHz), 16GB RAM

Output:

mmat time: 2.75476 seconds
loop time: 0.06801 seconds

Not sure why loop is so much faster. Perhaps MATLAB online c-compilation is at work here. Profiler reveals 'repmat' on line 65 and 'bsxfun' on line 68 are taking the most time in mmat in this example.

Hildo Bijl

### Hildo Bijl (view profile)

I would recommend defining nD as
nD = max([nDA nDB dim]);
The reason is that if you want to multiply along some high dimension dim, sometimes it may happen to be a singleton dimension. As a result, Matlab lowers the values of ndim(A) and ndim(B), which may cause the script to give an error.

Sandor Toth

### Sandor Toth (view profile)

Thank you Jorge, indeed when dim not equal to [1 2] line 54/55 can throw an error. I corrected the code!

Jorge Campos

### Jorge Campos (view profile)

A little improvement:

Replace lines 54 and 55 by

nA = [size(A),ones(1,nD-nDA)]; nA = nA(dim);
nB = [size(B),ones(1,nD-nDB)]; nB = nB(dim);

Sandor Toth

### Sandor Toth (view profile)

You are right, the whole intermediate matrix is stored in memory during the calculation to increase speed.

Thx

Jorge Campos

### Jorge Campos (view profile)

Excellent and efficient, however it's not applicable to huge arrays

Sandor Toth

### Sandor Toth (view profile)

You have to add the path of the file to the Matlab search path:

where pathName is the name of the folder where the mmat function is. After that, you can simply call mmat().

Shauryam

### Shauryam (view profile)

what path has to be given to the function?