NumenorForLife
NumenorForLife

Reputation: 1746

Multiplying a 3D Matrix with a 1D

I attempted to use the solution from this post: Multiply a 3D matrix with a 2D matrix, to vectorize the multiplication of a one dimensional with a three dimensional, but to no avail. Any help would be greatly appreciated!

for s = 1: s_length
   for a = 1: a_length
      for g = g_length
         two_dim(s,a) = two_dim(s,a) + one_dim(g) * three_dim(s,a,g); 
      end
   end
end

Upvotes: 1

Views: 1951

Answers (2)

Luis Mendo
Luis Mendo

Reputation: 112679

I think this does what you want.

two_dim = reshape(three_dim, [], size(three_dim,3))*one_dim(:);
two_dim = reshape(two_dim, size(three_dim,1), size(three_dim,2));

This works as follows:

  • First line reshapes your 3D array into a matrix, collapsing the first two dimensions into one. That way the operation you want is standard multiplication of the resulting matrix times a column vector.
  • Second line reshapes the result into matrix shape.

Upvotes: 2

Bentoy13
Bentoy13

Reputation: 4966

mtimes does not work with inputs with dimension larger than 2, so you have to find a way to do the multiplication by yourself. The solution of Luis Mendo is a nice solution; here is another one using bsxfun:

two_dim = two_dim + squeeze(sum(bsxfun(@times, three_dim, reshape(one_dim,[1 1 g_length])),3));

Here is how it works:

  • reshape makes the vector one_dim looking like a 3D array. This must be done because the multiplication between the vector and the 3D array is performed along the 3rd dimension, so Matlab need a hint on sizes.
  • bsxfun perfoms the element-wise multiplcation, so the result must be sumed up along the 3rd dimension (and squeezed to be compliant with a 2D matrix format)

Upvotes: 1

Related Questions