[討論] 如何加快程式的運算速度?

看板MATLAB作者 (ray)時間12年前 (2013/10/01 10:36), 編輯推噓5(5016)
留言21則, 4人參與, 最新討論串1/1
附上我的部分程式碼,我想改善的主要就是這個偵錯的迴圈 我用的版本是R2011a版的 我這版好像沒有biterr這個偵錯的內建程式, 只好自己寫暴力迴圈,但是處理速度實在是太慢了QQ 想請問版上的各位高手是否有其他更好的作法可以加快程式處理的速度~ for z=1:1:10 error=0; B = sqrt(0.005*z).*randn(2^18,1); L = sqrt(0.005*z).*randn(2^18,1); A = [1+B;B]; C = [L;L]; sigma(z,1)=sqrt(0.005*z+0.005*z); thresholdlevel=0.5*(max(A)+min(A)); N1(2^19,1)=zeros; for N=1:1:2^18; if A(N,1) < thresholdlevel; N1(N,1)=1; end end for n=2^18+1:1:2^19; if A(n,1) > thresholdlevel; N1(n,1)=1; end end BER(z,1)=sum(N1)/(2^19); OSNR(z,1)=1/(2*sigma(z,1)); end -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.163.68

10/01 10:52, , 1F
裡面兩個迴圈可換成 N1=A1(1:2^18)<th|A1(2^18+1:end)>th;
10/01 10:52, 1F

10/01 10:52, , 2F
th是thresholdlevel
10/01 10:52, 2F

10/01 11:13, , 3F
A1指的是A嗎~?
10/01 11:13, 3F

10/01 11:28, , 4F
對...打錯了..-_-
10/01 11:28, 4F

10/01 11:35, , 5F
XDD沒關係~~謝謝你~~速度真的差很多= =||
10/01 11:35, 5F

10/01 11:44, , 6F
有些運算可以簡化
10/01 11:44, 6F

10/01 13:18, , 7F
還有哪裡是可以簡化的呢~?(眼睛發亮中)
10/01 13:18, 7F

10/01 15:44, , 8F
主要是不用另外算A啦,可以靠B求到BER
10/01 15:44, 8F

10/01 15:45, , 9F
sunev提供的要寫成N1=[A(1:2^18)<th; A(2^18+1:end)>th];
10/01 15:45, 9F

10/01 15:46, , 10F
要不然維度不對。另外原po的N1(2^19,1)=zeros;會有問題,
10/01 15:46, 10F

10/01 15:46, , 11F
你要的是N1=zeros(2^19,1)吧?
10/01 15:46, 11F

10/01 15:50, , 12F
sunev的改寫提供最主要的加速,自測是從30秒變到0.16秒
10/01 15:50, 12F

10/01 15:52, , 13F
簡化從0.16秒變成0.12秒,sunev的改法夠快就不用再簡化啦XD
10/01 15:52, 13F

10/01 17:09, , 14F
跟我笨笨的迴圈比起來S大的方法很讚~XD
10/01 17:09, 14F

10/01 17:10, , 15F
另外我想知道的是:N()=0 和N=0()的差別是甚麼~為什麼這樣
10/01 17:10, 15F

10/01 17:11, , 16F
寫才不會有問題~
10/01 17:11, 16F

10/01 19:26, , 17F
N1(2^19,1)=zeros只把N1最後一個元素變0, 其它不變....
10/01 19:26, 17F

10/01 19:26, , 18F
N1=zeros(2^19,1)才會把所有N1的值設成0
10/01 19:26, 18F

10/01 21:17, , 19F
搞錯了XD,感謝banco幫忙修正。
10/01 21:17, 19F

10/01 22:28, , 20F
了解~~真是獲益良多阿~~謝謝S大跟B大^_^
10/01 22:28, 20F

10/05 21:58, , 21F
CUDA
10/05 21:58, 21F
文章代碼(AID): #1IIZKgzo (MATLAB)