2016-11-29 133 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中是不好的。