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

看板MATLAB作者 (thx)時間16年前 (2008/09/10 20:59), 編輯推噓1(103)
留言4則, 4人參與, 最新討論串1/2 (看更多)
如題所述 非常不合理的現象 矩陣竟然會比迴圈運算還久 問題圖解如下: 矩陣 w size為 1001 by 8 Y size為 8 by 128*150 運算 A = w*Y 示意圖如下 其中Y的部分是由150塊 8*128 的矩陣構成 8 128 128 ... 128 ┌─┐ ┌──┬──┬────────────────────┬───┐ │ │* │ 1 │ 2 │      ... │150│8 │ │ └──┴──┴────────────────────┴───┘ │ │ <----------- column長度共128*150這麼長 -----------> 1001│ │ │ │ │ │ │ │ └─┘ 乘起來會變成 1001 by 128*150的矩陣 A 然而 A 還有另一種做法 就是使用迴圈 如下 for i=1:150 8 128 ┌─┐ ┌──┐ │ │* │ i │8 │ │ └──┘ │ │ =>傳給 A(:,(i-1)*P+1:i*P) 1001│ │ │ │ │ │ │ │ └─┘ end 而這個迴圈運算的速度竟然會比第一種還快2倍左右 這是一個相當大的速度差距 感覺很反常 兩種方法的運算量是一樣的吧?? 然後矩陣化竟然會比迴圈法還慢...?? 請問這問題出在哪裡? 還是說 很正常.. 程式碼如下 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個要運算的矩陣(末) %矩陣化 (始) tic A=w*Y; toc %矩陣化 (末) %迴圈法 (始) tic for i=1:BLK A(:,(i-1)*P+1:i*P)=w*Y(:,(i-1)*P+1:i*P); end toc %迴圈法 (末) 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.34.35.136

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

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

09/11 04:38, , 3F
A=w*Y;=>0.195737sec. for i=1:BLK...=>0.240006sec.
09/11 04:38, 3F

09/11 13:07, , 4F
如果有抓取矩陣的動作~要記憶體的時間可能就會比迴圈久了
09/11 13:07, 4F
文章代碼(AID): #18nyIK0b (MATLAB)
文章代碼(AID): #18nyIK0b (MATLAB)