2015-11-13 29 views
0

我試圖寫泰勒強大的協方差估計沒有一個循環:矢量化這一點沒有使用循環

這是我目前的執行:

  • x是大小的樣本向量NXB]
  • cov是大小爲[bxb]的協方差矩陣
  • oldCov是來自前迭代的協方差矩陣。它也是一個[BXB]矩陣

這裏是當前實現:

invCov = pinv(oldCov); 
for i = 1:n 
    cov = cov + x(i,:).'*x(i,:)/sum(x(i,:)*invCov.*x(i,:),2); 
end 

現在這裏是我的問題:

  1. 是否有可能向量化這種沒有循環?
  2. 我有興趣嘗試通過使用其他後處理技術來進一步提高估計魯棒性。爲此,優選的是,結果將不是總和,而是大小爲[bxbxn]的向量「covElements」,其中每個元素都包含在其中。 I,:)/和(X(I,:)* invCov * X(I,:),2);

謝謝。

+0

我想你錯過了在代碼中的轉置,前'invCov' – jez

+0

實際上,X(I,:)是size [1,b]和invCov是[b,b],這樣代碼運行良好。 – user2324712

+0

啊是的,沒有看到invcov後的點 - 現在我看到你想要做什麼 – jez

回答

1

向量化件逐件,這裏有一個bsxfunned解決方案 -

%// Vectorize : "sum(x(i,:)*invCov.*x(i,:),2)" 
parte1 = sum((x*invCov).*x,2); 

%// Vectorize : "x(i,:)/sum(x(i,:)*invCov.*x(i,:),2)" 
xp1 = bsxfun(@rdivide,x,parte1); 

%// Get vectorized covElements and cov 
covElements_out = bsxfun(@times,permute(xp1,[3 2 1]),permute(x,[2 3 1])); 
cov_out = xp1.'*x; 
+0

好的解決方案!謝謝 – user2324712