2016-11-29 7 views
-1

Da ich gehört habe, dass Schleifen eine allgemeine schlechte in Matlab, versuche ich, meinen Code zu vektorisieren.Wie man corrcoeff in Matlab "vektorisiert"?

Ich habe den folgenden Code:

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

Diese mit der Größe von 1 x useDPs eine Deltamatrix erzeugt, wobei useDPs bis zu 1.000.000

geht Er berechnet den Korrelationskoeffizienten für jede Spalte und speichert es in Delta, also ist es eine sehr lange Schleife und ich möchte es für Matlab optimieren.

Was ich versuchte:

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

Aber das schafft eine 2 x 2-Matrix (es die korr Koeff der ganzen Matrizes berechnet, nicht für jede Spalte). Es ist also offensichtlich ein falscher Versuch.

Meine Frage ist also, ist es möglich, diese Schleife überhaupt zu "vektorisieren" (oder anderweitig zu optimieren)?

+0

Versuchen Sie es auf einer kleinen Teilmenge und lassen Sie uns wissen, wie es geht. –

+0

Es könnte auch helfen, die Dokumente zu lesen. Geben Sie beispielsweise 'doc corrcoeff' in der Befehlszeile ein. –

+0

Was soll ich versuchen? Mein "kann ich so etwas schreiben" funktioniert natürlich nicht. –

Antwort

1

Da Sie Problem nur zwei Variablen, können Sie es wie folgt schreiben:

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); 

Aber die Zeit, die ich auf Bezifferung dafür ausgegeben werden, zuzüglich diese Tatsache:

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 

was zeigt

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

wirklich, dass Sie t nicht glauben sollte Die Aussage, dass Schleifen in MATLAB schlecht sind.

Verwandte Themen