我正在为矩阵数组编写一个简单的自相关函数。每一行都是一个单独的时间序列,我们将它与自身自相关,并具有一定的滞后性。我发现最有争议的事情之一效果最好。
% 17 second benchmark
A = cell2mat(arrayfun(@(i) AutoCorrelation(array(i,:),lags)',1:size(array,1),'UniformOutput',false))';
其中函数本身如下
function ans = AutoCorrelation(array,lags)
arrayfun(@(x) dot(array(lags(x)+1:end),array(1:end-lags(x)))/(length(array)-lags(x)),1:length(lags));
end
我尝试过的其他事情:
A = zeros(size(array,1),length(lags));
T = size(array,2);
% 97 seconds benchmark
A = cell2mat(arrayfun(@(i) arrayfun(@(x) dot(array(i,lags(x)+1:end),array(i,1:end-lags(x)))/(size(array,2)-lags(x)),1:length(lags))',1:size(array,1),'UniformOutput',false))';
% 100 seconds benchmark
A = arrayfun(@(i,x) dot(array(i,lags(x)+1:end),array(i,1:end-lags(x)))/(size(array,2)-lags(x)),repmat((1:size(array,1))',1,length(lags)),repmat(1:length(lags),size(array,1),1));
% 27 second benchmark
for i = 1:length(lags)
A(:,i) = dot(array(:,lags(i)+1:end),array(:,1:end-lags(i)),2)/(T-lags(i));
end
% 95 second benchmark
for i = 1:length(lags)
for j = 1:size(array,1);
A(j,i) = dot(array(j,lags(i)+1:end),array(j,1:end-lags(i)),2)/(T-lags(i));
end
end
这更像是一个好奇心问题。如果你问我,我敢打赌直接点产品方法会发挥最佳效果。另外如果arrayfun工作得那么好,为什么double参数arrayfun表现不好?
我的阵列是512 * 100000双打数组。