Is it possible to multiply a 3D matrix with a coumn vector?

I have a 3D matrix with three rows and three columns. I want to multiply this matrix with a column vector of 3 rows. How can it be done?

Risposte (4)

Jan
Jan il 31 Mar 2017
Modificato: Jan il 31 Mar 2017
With Matlab >= 2016b:
A = rand(3, 3, 1000);
b = rand(3, 1);
C = squeeze(sum(A .* reshape(b, 1, 3), 2));
With older versions:
C = squeeze(sum(bsxfun(@times, A, reshape(b, 1, 3)), 2))

3 Commenti

The three versions have advantages and disadvantages:
  • KSSV: This is clean and simple. During debugging the intention is directly clear. The loop will need some time.
  • Andrei: This is efficient because it uses the fast built-in matrix multiplication. For large inputs permute needs time.
  • Mine: This does need a copy of the input data, but a temporary array also before creating the sum.
Timings:
A = rand(3, 3, 1e6);
B = rand(3, 1);
tic, C = zeros(3, size(A, 3));
for i = 1:size(A, 3)
C(:,i) = A(:,:,i)*B ;
end, toc
tic; C = reshape(reshape(permute(A,[2,1,3]),3,[]).'*B,3,[]); toc
tic; C = squeeze(sum(bsxfun(@times, A, reshape(B, 1, 3)), 2)); toc
Elapsed time is 1.605281 seconds. % Loop
Elapsed time is 0.069983 seconds. % permute
Elapsed time is 0.098582 seconds. % sum(times())
(Matlab 2009a! Test this on a modern version also)
I would insert KSSV's loop as a comment and Andrei's method for computations.
A = rand(3, 3, 1e6);
B = rand(3, 1);
tic, C = zeros(3, size(A, 3));
for i = 1:size(A, 3)
C(:,i) = A(:,:,i)*B ;
end, toc
tic; C = reshape(reshape(permute(A,[2,1,3]),3,[]).'*B,3,[]); toc
tic; C = squeeze(sum(bsxfun(@times, A, reshape(B, 1, 3)), 2)); toc
Elapsed time is 0.891301 seconds. % Loop
Elapsed time is 0.082350 seconds. % permute
Elapsed time is 0.088938 seconds. % sum(times())
Matlab 2019b Update 3

Accedi per commentare.

C = reshape(reshape(permute(A,[2,1,3]),3,[]).'*B,3,[]);
A = rand(3,3,3) ;
B = rand(3,1) ;
C = zeros(3,3) ;
for i = 1:3
C(:,i) = A(:,:,i)*B ;
end
Tyler R
Tyler R il 26 Mag 2017
Modificato: Tyler R il 26 Mag 2017
I got confused because some of the dimensions are size 3, but there is also a 3rd dimension, so for generalization's sake:
N = 150;
K = 20;
T = 30;
A = rand(N,K,T);
B = rand(K,1);
C = zeros(N,T);
Andrei's method:
C = reshape(reshape(permute(A,[2 1 3]),K,[]).'*B,N,[]);
Jan's method:
C = squeeze(sum(A .* reshape(B, 1, K), 2));
KSSV's method:
for t = 1:T
C(:,t) = A(:,:,t)*B ;
end

1 Commento

When B is rand(K, P), with P > 1, then both proposed methods don't work. I've tried different permuations, but no luck replicating the for loop result.

Accedi per commentare.

Categorie

Scopri di più su MATLAB in Centro assistenza e File Exchange

Richiesto:

il 31 Mar 2017

Commentato:

il 28 Gen 2021

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by