Is it possible to multiply a 3D matrix with a coumn vector?
16 ビュー (過去 30 日間)
古いコメントを表示
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?
0 件のコメント
回答 (4 件)
Jan
2017 年 3 月 31 日
編集済み: Jan
2017 年 3 月 31 日
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 件のコメント
Jan
2017 年 3 月 31 日
編集済み: Jan
2017 年 3 月 31 日
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.
Richard
2020 年 2 月 19 日
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
KSSV
2017 年 3 月 31 日
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
2017 年 5 月 26 日
編集済み: Tyler R
2017 年 5 月 26 日
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 件のコメント
Roman Gorlov
2021 年 1 月 28 日
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.
参考
カテゴリ
Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!