Re: [問題] 將迴圈改成矩陣化運算後 速度不可思議 …已回收

看板MATLAB作者 (樂於助人)時間16年前 (2008/09/11 05:49), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
[恕刪]

09/10 22:39,
你的說明跟你的程式碼好像有點出入 ?!
09/10 22:39
※ 編輯: iblind 來自: 218.34.35.136 (09/10 22:59)

09/10 23:01,
sorry,改掉共軛轉置了
09/10 23:01

09/11 04:38,
A=w*Y;=>0.195737sec. for i=1:BLK...=>0.240006sec.
09/11 04:38
我也是算到陣列運算"平均時間"比迴圏快。 但有幾次迴圏比較快。 我覺得只光看幾次算出來的時間然後判定誰快誰慢很不準。 有時電腦在忙碌,短時間的計算就會被影響很大。 所以我認為比較準確的測量計算時間的方法是: 把要測時間的程式碼部分加上迴圈多跑幾次。 例如這是我用迴圈多跑幾次的結果: ~~~~~~~~~~~~~~~~~~Version 1~~~~~~~~~~~~ tic for m = 1:20 A=w*Y; end toc Elapsed time is 15.352618 seconds. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~Version 2~~~~~~~~~~~~ tic for m = 1:20 for i=1:BLK A(:,(i-1)*P+1:i*P)=w*Y(:,(i-1)*P+1:i*P); end end Elapsed time is 21.496494 seconds. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 照理來講某程式碼跑愈多次,時間的overhead會由它主導, 也就是受到電腦其它程式忙碌的影響會愈小。 但要跑幾次比較好?總不能跑無限多次。 你可以想想,你可以忍受測多久的時間?1分鐘?1小時?1個月?... 或者迴圈m的數字代不同的值去測時間可以畫出趨勢圖。 例如: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ clc; clear; %參數設定及預先開出存放適當大小記憶體的變數(始) trial=1001; K=8; N=1024; P=N/K; BLK=150; w=zeros(trial,K); Y=zeros(K,P*BLK); A=zeros(trial,P*BLK); %參數設定及預先開出存放適當大小記憶體的變數(末) %隨機產生2個要運算的矩陣(始) w=rand(trial,K); for i=1:BLK Y(:,(i-1)*P+1:i*P) =rand(K,P); end %隨機產生2個要運算的矩陣(末) %矩陣化 (始) for n = 1:10 tic; for m = 1:n A=w*Y; end time1(n) = toc; end %矩陣化 (末) %迴圈法 (始) for n = 1:10 tic; for m = 1:n for i=1:BLK A(:,(i-1)*P+1:i*P)=w*Y(:,(i-1)*P+1:i*P); end end time2(n) = toc; end %迴圈法 (末) plot(time1, 'r'); hold on; plot(time2, 'b'); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Screen shot: http://zxvc.pixnet.net/album/photo/100667972 -- 西方三聖:http://p8.p.pixnet.net/albums/userpics/8/3/553683/1193661731.jpg
《佛說阿彌陀經》http://web.cc.ncu.edu.tw/~93501025/amtf.doc 十一面觀音咒:http://file.buda.idv.tw/music/DBZFY04.mp3 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.220.219
文章代碼(AID): #18o43ORB (MATLAB)
文章代碼(AID): #18o43ORB (MATLAB)