簡體   English   中英

如何優化此索引算法

[英]How can I optimize this indexing algorithm

我的問題

  • 無論如何,我可以加快這個計算嗎?
  • 是否有更好的算法或實現可用於計算相同的值?

描述算法

我有一個復雜的索引問題,我正在努力以有效的方式解決。

目標是使用來自等大小矩陣wdYdX值的組合來計算矩陣w_prime

w_prime(i,j)值計算為mean( w( indY & indX ) ) ,其中indYindX分別是等於ijdYdX的索引。

這是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

性能問題

在下面的示例中,該實現是足夠的; 然而,在我的實際使用情況wdYdX是〜 3000x3000w_prime是〜 60X900 這意味着每個指數計算都發生在大約900萬個元素上。 不用這個實現太慢而無法使用。 另外,我需要運行此代碼幾十次。

示例計算

如果我想計算w(1,1)

  • 找到等於1的dY索引,另存為indY
  • 找到等於1的dX索引,另存為indX

在此輸入圖像描述

  • 找到indYindX保存為ind

在此輸入圖像描述

  • mean( w(ind) )w_prime(1,1)

在此輸入圖像描述

一般問題描述

我有一個由兩個向量XT定義的設定點,兩者都是1XN,其中N是~3000。 另外,X和T的值分別是由間隔(160)和(1 900)限定的整數。

矩陣dXdT只是距離矩陣,意味着它們包含點之間的成對距離。 dx(i,j)等於abs( x(i) - x(j) )

它們使用以下公式計算: dx = pdist(x);

矩陣w可以被認為是權重矩陣,其描述了一個點對另一個點的影響程度。

計算的目的w_prime(a,b)是確定之間的平均體重的子集由分隔點的aX維度和bT尺寸。

這可以表示如下:

在此輸入圖像描述

這與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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM