How to speed up my code and improve/avoid for loop

Dear all, that's my piece of code that works correctly but too slow.
T=rand(100000,1)-0.3;
eTG=zeros(size(T)); %set eTG(1)=0 and preallocate
for i=2:length(T)
eTG(i)=eTG(i-1)+T(i-1);
eTG(i(eTG(i)>0))=0;
end
Preallocation doesn't help and "run and time" tool shows that string
eTG(i(eTG(i)>0))=0;
eats 83% of the total time. Please give me your advices how to optimize this code. Are there any ways to vectorize this code and avoid loops at all?

5 件のコメント

per isakson
per isakson 2017 年 10 月 12 日
Given i is a scalar, what is
eTG(i(eTG(i)>0))=0
supposed to do?
Sergei Zhuravlev
Sergei Zhuravlev 2017 年 10 月 12 日
編集済み: Sergei Zhuravlev 2017 年 10 月 12 日
Check if eTG variable is positive on every step and if yes, sets it to zero
Walter Roberson
Walter Roberson 2017 年 10 月 12 日
Replace that with
eTG(i) = max(0, eTG(i));
Could you confirm that you want negative values to be left untouched, but positive values to be set to 0?
Sergei Zhuravlev
Sergei Zhuravlev 2017 年 10 月 12 日
編集済み: Sergei Zhuravlev 2017 年 10 月 12 日
Yes, exactly. Using max function gives wrong results, Should be "min" I suppose. Thank you!
Walter Roberson
Walter Roberson 2017 年 10 月 12 日
Dang, I got it wrong this time too. Yes, min(0, eTG(i)) if you want negative untouched and positive set to 0.

サインインしてコメントする。

回答 (1 件)

Sergei Zhuravlev
Sergei Zhuravlev 2017 年 10 月 12 日
編集済み: Sergei Zhuravlev 2017 年 10 月 12 日

0 投票

This code is 10 times faster (thanks to Walter Roberson)
T=rand(100000,1)-0.3;
eTG=zeros(size(T)); %set eTG(1)=0 and preallocate
for i=2:length(T)
eTG(i)=eTG(i-1)+T(i-1);
eTG(i) = min(0, eTG(i));
end

カテゴリ

製品

タグ

質問済み:

2017 年 10 月 12 日

編集済み:

2017 年 10 月 12 日

Community Treasure Hunt

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

Start Hunting!

Translated by