我有一個行向量q,有200個元素,還有一個行向量dij,它是pdist函式的輸出,目前有48216200個元素,但我希望能夠更高。我想做的操作基本上是:
t=sum(q'*dij,2) 。
然而,由于這試圖分配一個200x48211290陣列,它抱怨說這將需要70GB的記憶體。因此,我是這樣做的:
t = zeros(numel(q),1) 。
for i=1:numel(q)
qi = q(i)。
factor = qi*dij;
t(i)=sum(factor)。
結束。
然而,這需要太多的時間。我所說的太多時間是指它需要36s,這比pdist函式所需的時間長了好幾個數量級。有什么辦法可以在不明確分配這么多記憶體的情況下加快這個操作?我在這里假設,如果第一種方法可以分配記憶體,(作為一個矢量操作)它將會更快。
uj5u.com熱心網友回復:
只要使用乘法的分布式屬性與加法相比:
t = q'*sum(dij);
uj5u.com熱心網友回復:
為了測驗Cris在第一篇評論中所說的內容,我創建了3個".m "檔案,如下所示:
vec.m :res=sum(sin(d.*q')./(d.*q'))。
forloop.m
for i=1: 200
res(i)=sum(sin(d.*q(i))./(d.*q(i) )。)
結束。
和test.m:
clc
清除所有
d=rand(4e6, 1)。
q=rand(200,1) 。
res=zeros(1,200) 。
forloop;
vec;
forloop;
vec;
forloop;
vec。
然后我用matlab的運行和時間分析器。 結果是非常令人驚訝的! :
3呼叫forloop : ~10.5 S
3 呼叫vec : 15.5 S !!!
另外,當我將資料轉換為單數時,結果是:
... forloop : 7.5 S
...vec : 8.5 S
我不知道為什么for-loop在這些情況下會更快,但是對于你的問題,你可以通過在回圈中生成較少的變數和使用垂直向量(我想)來加速事情。
q=single(rand(200,1)>。)
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/309700.html
標籤:
