Matlab 一种相关计算的优化
我现在有一些代码:Matlab 一种相关计算的优化,matlab,correlation,Matlab,Correlation,我现在有一些代码: data = repmat(1:10, 1, 2); N = 6; period = 10; result = NaN * zeros(1, period); for i=1:period range_indices = i:i+N; temp_data = data(range_indices); result(i) = sum( temp_data .* fliplr(temp_data)); end 我试图让它更快(对于更大的数据集,例如pe
data = repmat(1:10, 1, 2);
N = 6;
period = 10;
result = NaN * zeros(1, period);
for i=1:period
range_indices = i:i+N;
temp_data = data(range_indices);
result(i) = sum( temp_data .* fliplr(temp_data));
end
我试图让它更快(对于更大的数据集,例如period=2000和N=1600),但我无法将它转换为矩阵运算形式(例如使用conv或xcorr)。您应该能够完全线性化它。首先,考虑<代码> RangeEx索引< /代码>。其形式如下:
1 -> N
2 -> N+1
...
P -> N+P
其中p是周期。我们可以这样设置这些值的矩阵:
range_indices = bsxfun(@plus,1:N,(1:period)'-1);
我们可以使用这些直接获取数据,如下所示:
temp_data = data(range_indices);
然后,相当简单地完成该功能:
result = sum(temp_data.*fliplr(temp_data));
最后,这与问题无关,只是我想指出的一点——将来如果需要生成NaN值的矩阵,应该使用
NaN(1,句点)
。您应该能够完全线性化这一点。首先,考虑<代码> RangeEx索引< /代码>。其形式如下:
1 -> N
2 -> N+1
...
P -> N+P
其中p是周期。我们可以这样设置这些值的矩阵:
range_indices = bsxfun(@plus,1:N,(1:period)'-1);
我们可以使用这些直接获取数据,如下所示:
temp_data = data(range_indices);
然后,相当简单地完成该功能:
result = sum(temp_data.*fliplr(temp_data));
最后,这与问题无关,但只是我想指出的一点——将来如果需要生成NaN值的矩阵,应该使用
NaN(1,句点)
。bsxfun
非常有趣!当然,谢谢。。我需要在bsxfun调用中使用sum(..,2)
,和1:period+1
,然后结果是相同的(而且更快)。bsxfun
非常有趣!当然,谢谢。。在bsxfun调用中,我需要sum(..,2)
,和1:period+1
,然后结果是相同的(而且更快)。