2012-02-01 204 views
0

我需要儘快計算矩陣查找(請參見下文)。快速矩陣查找

totquadpoint和nbval.Wepast是固定的標量,每個200左右(向量flnewcumyieldpos和flneweta1pos的維度)。 nexttsteppenal是一個三維矩陣(尺寸至少爲80 * 80 * 80)

因爲我需要在很多時候做這個操作(這個雙循環本身就是一個三重嵌套循環),所以我需要使它快速。有沒有辦法讓它比下面寫的更快?如果在Matlab中不可能,那麼如果我嘗試在Java/C中創建這段代碼,我可以期待什麼類型的增益?

-------- CODE:-----------------

for k=1:totquadpoint 
    nexttsteppenalYA1dd=nexttsteppenal(flnewcumyieldpos(k),flneweta1pos(k),:); 
    nexttsteppenalYA1du=nexttsteppenal(upflnewcumyieldpos(k),flneweta1pos(k),:); 
    nexttsteppenalYA1ud=nexttsteppenal(flnewcumyieldpos(k),upflneweta1pos(k),:); 
    nexttsteppenalYA1uu=nexttsteppenal(upflnewcumyieldpos(k),upflneweta1pos(k),:); 

    flnewportvalposvec=flnewportvalpos(k,:); 
    upflnewportvalposvec=upflnewportvalpos(k,:); 

    for we=1:nbval.Wepast             
     penddd(k,we)=nexttsteppenalYA1dd(flnewportvalposvec(we)); 
     penddu(k,we)=nexttsteppenalYA1dd(upflnewportvalposvec(we)); 
     pendud(k,we)=nexttsteppenalYA1du(flnewportvalposvec(we)); 
     penduu(k,we)=nexttsteppenalYA1du(upflnewportvalposvec(we)); 

     penudd(k,we)=nexttsteppenalYA1ud(flnewportvalposvec(we)); 
     penudu(k,we)=nexttsteppenalYA1ud(upflnewportvalposvec(we)); 
     penuud(k,we)=nexttsteppenalYA1uu(flnewportvalposvec(we)); 
     penuuu(k,we)=nexttsteppenalYA1uu(upflnewportvalposvec(we)); 

    end 
end 
+0

請添加數據,以便人們可以輕鬆地重現您的問題。 – 2012-02-01 21:29:52

+2

*不寒而慄*我看到你使用'explicitVariableNames',但他們必須這麼長嗎? – Jonas 2012-02-01 21:40:33

+0

@Jonas:我可以縮短它們。變量名稱的長度是否會影響速度(或僅用於提高可讀性?) – 2012-02-02 22:12:33

回答

0

此:

for w=1:n 
    p(k,w)=d(f(w)); 
end 

應該是:

p(k,1:n)=d(f(1:n)); 

甚至更​​好,當nf長度:

p(k,:)=d(f); 

對於外環,您可能需要sub2ind()

+0

我用下面的代碼(下面)嘗試了你的想法,但是這會減慢程序的速度(從tic/toc到1.1秒到1.5秒)。我想我必須找到另一種方式。 penddd = nexttsteppenal(sub2ind(size(nexttsteppenal)),repmat(flnewcumyieldpos,1,nbval.Wepast),repmat(flneweta1pos,1,nbval.Wepast),flnewportvalpos)); 等 – 2012-02-02 22:10:31

0

這裏是一個更可讀的版本的代碼與表的模擬值。 我的問題是如何優化兩個嵌套for循環的速度結束(我需要運行這個循環可能一百萬次)。

quadpoints=800; 
nbWe=100; 

penddd=zeros(quadpoints,nbWe); 
penddu=zeros(quadpoints,nbWe); 
pendud=zeros(quadpoints,nbWe); 
penduu=zeros(quadpoints,nbWe); 
penudd=zeros(quadpoints,nbWe); 
penudu=zeros(quadpoints,nbWe); 
penuud=zeros(quadpoints,nbWe); 
penuuu=zeros(quadpoints,nbWe); 

nsp=rand(100,50,100); 

ypos=min(sort(poissrnd(50,quadpoints,1),'ascend'),100); 
uypos=min(ypos,100); 
etapos=min(sort(poissrnd(25,quadpoints,1),'ascend'),50); 
uetapos=min(etapos,50); 
Vpos=min(sort(poissrnd(50,quadpoints,nbWe),'ascend'),100); 
uVpos=min(Vpos,100); 

for k=1:quadpoints 
    nspdd=nsp(ypos(k),etapos(k),:); 
    nspdu=nsp(uypos(k),etapos(k),:); 
    nspud=nsp(ypos(k),uetapos(k),:); 
    nspuu=nsp(uypos(k),uetapos(k),:); 
    dVvec=Vpos(k,:); 
    uVvec=uVpos(k,:); 

     for we=1:nbWe 
    penddd(k,we)=nspdd(dVvec(we)); 
     penddu(k,we)=nspdd(uVvec(we)); 
     pendud(k,we)=nspdu(dVvec(we)); 
     penduu(k,we)=nspdu(uVvec(we)); 
     penudd(k,we)=nspud(dVvec(we)); 
     penudu(k,we)=nspud(uVvec(we)); 
     penuud(k,we)=nspuu(dVvec(we)); 
     penuuu(k,we)=nspuu(uVvec(we)); 

     end 
end