Speed up this bottleneck line of code
41 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
採用された回答
Matt J
2025 年 2 月 22 日 20:29
編集済み: Matt J
2025 年 2 月 22 日 20:31
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 件のコメント
その他の回答 (1 件)
Walter Roberson
2025 年 2 月 22 日 17:00
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 件のコメント
Walter Roberson
2025 年 2 月 22 日 17:11
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.
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!