Vectorization for Two Nested for-loops

5 views (last 30 days)
Mohammed
Mohammed on 1 Jul 2024
Edited: Stephen23 on 1 Jul 2024
Hello all,
I'm trying to vectorize some operation between two 2D matrices, A and B. Basically, the process is multiplying every row verctor from matrix B by every vector from matrix A and store the value in matrix C. The correct non-vectorized code looks as follows:
A = [2 3 4; 5 2 1; 1 4 3];
B = [3 4 4; 4 2 1; 4 4 1];
C = zeros(3,3); % Initializing C
for ii=1:size(A,1)
for jj=1:size(B,1)
AA = A(ii,:);
BB = transpose(B(jj,:));
C(jj,ii) = sum(BB*AA, 'all')
end
end
C
The resultant C should looks as:
C =
99 88 88
63 56 56
81 72 72
Can I get help here?
Thanks!

Answers (2)

Tomoaki Takagi
Tomoaki Takagi on 1 Jul 2024
Try:
A = [2 3 4; 5 2 1; 1 4 3];
B = [3 4 4; 4 2 1; 4 4 1];
C = repmat(A,3).*repelem(B,3,3);
C = reshape(sum(C,2),3,3)'

Stephen23
Stephen23 on 1 Jul 2024
Edited: Stephen23 on 1 Jul 2024
Without creating multiple copies of data in memory:
A = [2 3 4; 5 2 1; 1 4 3];
B = [3 4 4; 4 2 1; 4 4 1];
C = sum(permute(A,[3,1,2,4]).*permute(B,[1,3,4,2]),3:4)
C = 3x3
99 88 88 63 56 56 81 72 72
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
The same basic approach, more verbose but possibly more efficient:
As = size(A);
Bs = size(B);
C = sum(reshape(A,[1,As]).*reshape(B,[Bs(1),1,1,Bs(2)]),3:4)
C = 3x3
99 88 88 63 56 56 81 72 72
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!