Column multiplication of two 2D matrices.
    6 views (last 30 days)
  
       Show older comments
    
Hi there, 
I have two quite large matrices with the following sizes: 
A = rand(94037,2240) B=rand(2240,2240)
I would like to mutiply each column of A by the transpose of each column of B (bascially two vector multiplication). Therefore each mutiplcation gives me a 2D matrix wih size (94037,2240) and I would like to store the result of each multiplication in a 3d MATRIX. 
The thing is I can do this with for-loop as show below but its very slow and in the middle of operation matlab exist, because its quite heavy.
S = zeros(94037,2240,2240);
for i=1:1:2240
  S(:,:,i) =A(:,i)*(B(:,i))';
end
Is there anyway I can do this without using for loop to speed up the process ?
Thanks for the help.
Best, 
Nikan 
2 Comments
  Matt J
      
      
 on 13 Jan 2021
				Outer products are often both an inefficient and an avoidable step in many computations. What do you plan to do with S once you've computed it? 
Answers (2)
  Matt J
      
      
 on 13 Jan 2021
        
      Edited: Matt J
      
      
 on 14 Jan 2021
  
      I doubt you will be able to do the computation with the matrix sizes you've indicated. The result will consume 3.5 TB of RAM in double floating point. However, if you can scale down the matrix sizes, then a loop-free solution is as follows,
[ma,na]=size(A);
[mb,nb]=size(B);
S=reshape(A,ma,1,na).*reshape(B,1,mb,nb);
2 Comments
  Bruno Luong
      
      
 on 14 Jan 2021
				
      Edited: Bruno Luong
      
      
 on 14 Jan 2021
  
			I guess there is a typo. The right command has no brakets
S = reshape(A,ma,1,na) .* reshape(B,1,mb,nb);
See Also
Categories
				Find more on Loops and Conditional Statements in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!