2015-10-28 109 views
2

消除環路鑑於我們已:你將如何從這個MATLAB代碼

  • x是與大小的二維矩陣[NUMSAMPLES X numFeatures]
  • A是2D方陣大小[numFeatures X numFeatures]
  • B是一個一維向量,其具有尺寸[1×numFeatures]

我想沒有循環來計算下面的代碼:(或者在一個方式更快的方式)

out = zeros(1,numSamples); 
for i = 1:numSamples 
    res = sum(repmat(B - x(i,:), numSamples, 1)*A.*(x - repmat(x(i,:), numSamples, 1)), 2).^2; 
    out(i) = var(res); 
end 

如果您對上述更快的改進有其他建議,它也是值得歡迎的。

+1

讓我們退後一步。此代碼在測試數據上運行時速度有多快?你對時間不滿意嗎? – rayryeng

+0

不幸的是沒有。對於大量的樣品,它變得非常緩慢。 – user2324712

+0

除了上面的評論之外,是否還有一個特定的公式試圖實現? –

回答

7

您可以bsxfun那些件逐件進行矢量化的解決方案 -

P1 = bsxfun(@minus,B,x)*A; 
P2 = bsxfun(@minus,x,permute(x,[3 2 1])); 
out = var(squeeze(sum(bsxfun(@times,P1,P2),2)).^2.'); 

部分矢量方法 -

P = (bsxfun(@minus,B,x)*A).'; %//' 
out = zeros(1,numSamples); 
for i = 1:numSamples 
    out(i) = var((bsxfun(@minus,x,x(i,:))*P(:,i)).^2); 
end 
+0

謝謝你的回覆,讓我驗證這個作品:) – user2324712

+2

@ user2324712該死的,我在那裏看到一些不相信! ;) – Divakar

+0

絕不是。我親眼目睹了最好的學習。 – user2324712