Performance 为什么奇怪的嵌套arrayfun最具时效性?

Performance 为什么奇怪的嵌套arrayfun最具时效性?,performance,matlab,time,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)

我正在为矩阵数组编写一个简单的自相关函数。每一行都是一个独立的时间序列,我们用一组特定的滞后来自动关联它。我发现最有创意的东西之一效果最好

% 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工作得那么好,那么为什么双参数arrayfun的性能不好呢


我的数组是512*100000双精度数组。

至少在我的示例数据中,
%27秒基准测试
-sulution生成不同的输出,但速度更快。这很有趣。这是多么不同啊。我想我已经检查过了,它们的区别只是数值上的误差。你是对的,这只是一个微小的精度误差。这个版本在我运行时速度更快。