# How can i speed up the following?

3 views (last 30 days)
Bill Hannon on 25 Apr 2016
Commented: Bill Hannon on 29 Apr 2016
Can anyone help me speed up what is written below? I have a large code and this routine, while seemingly fast, gets called a great deal.
a = rand(31,31);
TmTn = rand(301,301,31,31);
f = zeros(size(TmTn,1),size(TmTn,2));
[qe pe] = size(a);
for p = 1:pe
for q = 1:qe;
f = f + a(q,p).*TmTn(:,:,p,q);
end
end
Note: I have tried various sequences of permute, repmat, direct multiplication, moving the sum, parfor and reshape.
##### 2 CommentsShowHide 1 older comment
Bill Hannon on 28 Apr 2016
Yes. Several times. The script above gets called ~2000 times. It is the slowest (~0.5sec/call) portion of the large (~30min) code.

Roger Stafford on 29 Apr 2016
You can turn this into ordinary matrix multiplication. Since matlab is specially optimized for matrix multiplication, it might be faster.
a = rand(31,31);
TmTn = rand(301,301,31,31);
a2 = reshape(a.',[],1); % Transpose 'a' and make it a column vector
TmTn2 = reshape(TmTn,[],31^2); % Change TmTn to a 2D matrix
f = reshape(TmTn2*a2,301,301); % Use ordinary matrix multiplication and then reshape back
Bill Hannon on 29 Apr 2016
Superb & thank you. Thank you all. That was the reduction I needed.

Arnab Sen on 28 Apr 2016
Hi Bill, You can try to replace the loop by vectorization. Something like below:
a = rand(31,31); TmTn = rand(301,301,31,31);
f = zeros(size(TmTn,1),size(TmTn,2));
[qe pe] = size(a);
TmTn2=reshape(TmTn,301*31,301*31);
TmTn1=mat2cell(TmTn2,size(TmTn,1)*ones(1,p),size(TmTn,2)*ones(1,q));
b=a';
C= cellfun(@(x,y) x.*y, mat2cell(b,ones(1,pe),ones(1,qe)),TmTn1, 'UniformOutput',false);
f=sum(cat(3,C{:,:}),3);
Using 'perfor' is another option where we can multiple for loops in parallel. For more detail refer to the following link:
##### 2 CommentsShowHide 1 older comment
Bill Hannon on 28 Apr 2016
Thank you for the (any) suggestion(s). I tic/toced the current and suggest cellfun approach while in debug mode. The cellfun approach is 3 times slower than the for loop.

Jan on 28 Apr 2016
This seems to be a problem for FEX: MMX or FEX: MTIMESX .
Bill Hannon on 28 Apr 2016
The MMX & MTIMESX documentation leads me to believe they focus on matrix products and not element by element multiplication. Am i mistaken?