Speed up this bottleneck line of code
4 views (last 30 days)
Show older comments
Hello.
I have a big chunk of code, here is a part of it (arrays a, b and c, indeces ind1 and ind2 are actually different, its just an artificially constructed example):
n = 10000;
m = 5000;
k = 20;
a = rand(n,m);
b = rand(n,m);
c = rand(m+k,n)*1.1-0.1;
ind1 = repmat([ones(1,m/k),0]==1,1,k)';
ind2 = repmat([0,ones(1,m/k)]==1,1,k)';
tic;
d = m * sum(a .* b .* max(0, c(ind1,:) - c(ind2,:))',2);
toc
I am not satisfied with it's speed. After profiling my code i found that string
d = m * sum(a .* b .* max(0, c(ind1,:) - c(ind2,:))',2);
is a bottleneck of my code. Indeces ind1 and ind2 are almost entirely true.
Now im not sure now to improve from here, i've tried to google how to speed up .* operation or speed up indexing of matrix c but with no luck. Any advice would be great.
Thanks!
0 Comments
Accepted Answer
Matt J
on 22 Feb 2025
Edited: Matt J
on 22 Feb 2025
If you can construct c in transposed form, there are some savings to be had,
n = 10000;
m = 5000;
k = 20;
a = rand(n,m);
b = rand(n,m);
c = rand(m+k,n)*1.1-0.1;
tic;
s=m/k+1;
[ind1,ind2]=deal((1:m+k)');
ind1(s:s:end)=[];
ind2(1:s:end)=[];
toc
tic;
d1 = m * sum(a .* b .* max(0, c(ind1,:)-c(ind2,:))',2);
toc
ct=c';
I=[(1:m)',(1:m)'];
S=repmat(m*[1,-1],m,1);
tic;
J=[ind1,ind2];
A=sparse(J,I,S,m+k,m);
d2 = sum( a.*b.*max(0,ct*A) ,2);
toc
percentDifference = norm(d1-d2)/norm(d1)*100
2 Comments
More Answers (1)
Walter Roberson
on 22 Feb 2025
n = 10000;
m = 5000;
k = 20;
tic
a = rand(n,m);
b = rand(n,m);
c = rand(m+k,n)*1.1-0.1;
toc
ind1 = repmat([ones(1,m/k),0]==1,1,k)';
ind2 = repmat([0,ones(1,m/k)]==1,1,k)';
tic;
d = m * sum(a .* b .* max(0, c(ind1,:) - c(ind2,:))',2);
toc
Your bottleneck is in your generation of a, b, and c -- not in your calculation of d.
3 Comments
Walter Roberson
on 22 Feb 2025
ind1 is equivalent to selecting 1:m/k . ind2 is equivalent to selecting 2:m/k+1. It might potentially be faster to use the numeric indices instead of logical indices.
See Also
Categories
Find more on Logical 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!