为什么奇怪的嵌套arrayfun最有效?

时间:2014-08-21 21:59:06

标签: performance matlab time

我正在为矩阵数组编写一个简单的自相关函数。每一行都是一个单独的时间序列,我们将它与自身自相关,并具有一定的滞后性。我发现最有争议的事情之一效果最好。

% 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双打数组。

0 个答案:

没有答案