看板 MATLAB 關於我們 聯絡資訊
附上我的部分程式碼,我想改善的主要就是這個偵錯的迴圈 我用的版本是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
sunev:裡面兩個迴圈可換成 N1=A1(1:2^18)<th|A1(2^18+1:end)>th; 10/01 10:52
sunev:th是thresholdlevel 10/01 10:52
np62077:A1指的是A嗎~? 10/01 11:13
sunev:對...打錯了..-_- 10/01 11:28
np62077:XDD沒關係~~謝謝你~~速度真的差很多= =|| 10/01 11:35
banco:有些運算可以簡化 10/01 11:44
np62077:還有哪裡是可以簡化的呢~?(眼睛發亮中) 10/01 13:18
banco:主要是不用另外算A啦,可以靠B求到BER 10/01 15:44
banco:sunev提供的要寫成N1=[A(1:2^18)<th; A(2^18+1:end)>th]; 10/01 15:45
banco:要不然維度不對。另外原po的N1(2^19,1)=zeros;會有問題, 10/01 15:46
banco:你要的是N1=zeros(2^19,1)吧? 10/01 15:46
banco:sunev的改寫提供最主要的加速,自測是從30秒變到0.16秒 10/01 15:50
banco:簡化從0.16秒變成0.12秒,sunev的改法夠快就不用再簡化啦XD 10/01 15:52
np62077:跟我笨笨的迴圈比起來S大的方法很讚~XD 10/01 17:09
np62077:另外我想知道的是:N()=0 和N=0()的差別是甚麼~為什麼這樣 10/01 17:10
np62077:寫才不會有問題~ 10/01 17:11
banco:N1(2^19,1)=zeros只把N1最後一個元素變0, 其它不變.... 10/01 19:26
banco:N1=zeros(2^19,1)才會把所有N1的值設成0 10/01 19:26
sunev:搞錯了XD,感謝banco幫忙修正。 10/01 21:17
np62077:了解~~真是獲益良多阿~~謝謝S大跟B大^_^ 10/01 22:28
Ga11ardo:CUDA 10/05 21:58