2016-11-29 3 views
-1

Поскольку я слышал, что в Matlab зацикливается общее плохое, я пытаюсь процитировать мой код.Как «векторизовать» corrcoeff в Matlab?

У меня есть следующий код:

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

Он вычисляет коэффициент корреляции для каждого столбца и сохраняет его в delta, поэтому его очень длинный цикл, и я бы хотел его оптимизировать для 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 плохие.