[英]How can I optimize this indexing algorithm
我有一個復雜的索引問題,我正在努力以有效的方式解決。
目標是使用來自等大小矩陣w
, dY
和dX
值的組合來計算矩陣w_prime
。
w_prime(i,j)
值計算為mean( w( indY & indX ) )
,其中indY
和indX
分別是等於i
和j
的dY
和dX
的索引。
這是matlab中用於計算w_prime
的簡單實現:
for i = 1:size(w_prime,1)
indY = dY == i;
for j = 1:size(w_prime,2)
indX = dX == j;
w_prime(ind) = mean( w( indY & indX ) );
end
end
在下面的示例中,該實現是足夠的; 然而,在我的實際使用情況w
, dY
, dX
是〜 3000x3000
和w_prime
是〜 60X900
。 這意味着每個指數計算都發生在大約900萬個元素上。 不用這個實現太慢而無法使用。 另外,我需要運行此代碼幾十次。
如果我想計算w(1,1)
dY
索引,另存為indY
dX
索引,另存為indX
indY
和indX
保存為ind
mean( w(ind) )
到w_prime(1,1)
我有一個由兩個向量X
和T
定義的設定點,兩者都是1XN,其中N是~3000。 另外,X和T的值分別是由間隔(160)和(1 900)限定的整數。
矩陣dX
和dT
只是距離矩陣,意味着它們包含點之間的成對距離。 即dx(i,j)
等於abs( x(i) - x(j) )
。
它們使用以下公式計算: dx = pdist(x);
矩陣w
可以被認為是權重矩陣,其描述了一個點對另一個點的影響程度。
計算的目的w_prime(a,b)
是確定之間的平均體重的子集由分隔點的a
在X
維度和b
在T
尺寸。
這可以表示如下:
這與ACCUMARRAY直截了當 :
nx = max(dX(:));
ny = max(dY(:));
w_prime = accumarray([dX(:),dY(:)],w(:),[nx,ny],@mean,NaN)
在沒有相應的索引對的地方,輸出將是具有NaN的nx
by- ny
大小的數組。 如果您確定將始終存在完整的索引,則可以將上述計算簡化為
w_prime = accumarray([dX(:),dY(:)],w(:),[],@mean)
那么,accumarray做了什么? 它查看[dX(:),dY(:)]
。 每行給w_prime
所貢獻的w_prime
的(i,j)
坐標對。 對於所有對(1,1)
,它將函數( @mean
)應用於w(:)
的相應條目,並將輸出寫入w_prime(1,1)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.