2016-11-29 135 views
-1

因爲我聽說循環在MATLAB中一般不好,我嘗試向量化我的代碼。如何在matlab中「矢量化」corrcoeff?

我有以下代碼:

for dp_point = 1:useDPs 
    cc = corrcoef(Traces(:,dp_point), hws(:,dp_point)); 
    delta(dp_point) = cc(2); 
end; 

這產生以1×useDPs大小,其中useDPs上升到1.000.000

增量矩陣它計算的相關係數爲每列並保存在三角洲,因此它是一個非常長的循環,我想優化它的matlab。

我的嘗試:

delta = corrcoef(Traces(:,1:useDPs), hws(:,1:useDPs)); 

但是這創造了一個2×2矩陣(它計算整個矩陣的科爾_係數,而不是每列)。所以這顯然是一個錯誤的嘗試。

所以我的問題是,是否有可能「矢量化」(或以其他方式優化)該循環呢?

+0

嘗試一小部分,讓我們知道它是怎麼回事。 –

+0

它也可能有助於閱讀文檔。例如,在命令行上鍵入'doc corrcoeff'。 –

+0

我應該嘗試什麼?我的「我可以寫這樣的東西」顯然不起作用。 –

回答

1

既然你的問題只有兩個變量,你可以寫這樣的:

m = size(X,1); 

Xc = bsxfun(@minus, X, sum(X)/m); 
Yc = bsxfun(@minus, Y, sum(Y)/m); 

xy = sum(Xc.*Yc)/(m-1); 
xx = sum(Xc.*Xc)/(m-1); 
yy = sum(Yc.*Yc)/(m-1); 

delta = xy ./ sqrt(xx.*yy); 

但是,我在搞清楚了這一點所花的時間,再加上這樣一個事實:

clc 

N = 1e4; 
M = 1e3; 

X = rand(N,M); 
Y = rand(N,M); 

% Loopy version  
tic 
D = zeros(N,1); 
for ii = 1:M 
    cc = corrcoef(X(:,ii), Y(:,ii)); 
    D(ii) = cc(2); 
end 
toc 


% "Vectorized" version 
m = N; 
tic  

Xc = bsxfun(@minus, X, sum(X)/m); 
Yc = bsxfun(@minus, Y, sum(Y)/m); 

xy = sum(Xc.*Yc)/(m-1); 
xx = sum(Xc.*Xc)/(m-1); 
yy = sum(Yc.*Yc)/(m-1); 

delta = xy ./ sqrt(xx.*yy); 

toc 

Elapsed time is 0.272682 seconds. % loop 
Elapsed time is 0.384599 seconds. % non-loop 

確實表明你不應該相信噸他聲明循環在MATLAB中是不好的。