我正在使用 64 位 matlab 和 32g 的 RAM(你知道的)。
我有一个包含 130 万个数字(整数)的文件(向量)。我想制作另一个相同长度的向量,其中每个点是整个第一个向量的加权平均值,由与该位置的反距离加权(实际上是位置 ^-0.1,而不是 ^-1,但用于示例目的) . 我不能使用 matlab 的“过滤器”功能,因为它只能平均当前点之前的东西,对吧?为了更清楚地解释,这里是 3 个元素的示例
data = [ 2 6 9 ]
weights = [ 1 1/2 1/3; 1/2 1 1/2; 1/3 1/2 1 ]
results=data*weights= [ 8 11.5 12.666 ]
i.e.
8 = 2*1 + 6*1/2 + 9*1/3
11.5 = 2*1/2 + 6*1 + 9*1/2
12.666 = 2*1/3 + 6*1/2 + 9*1
所以新向量中的每个点都是整个第一个向量的加权平均值,权重为 1/(与该位置的距离+1)。
我可以为每个点重新制作权重向量,然后逐个元素计算结果向量,但这需要 for 循环的 130 万次迭代,每个迭代包含 130 万次乘法。我宁愿使用直接矩阵乘法,将 1x1.3mil 乘以 1.3milx1.3mil,这在理论上可行,但我无法加载那么大的矩阵。
然后我尝试使用 shell 脚本制作矩阵并在 matlab 中对其进行索引,因此一次只调用矩阵的相关列,但这也需要很长时间。
我不必在 matlab 中执行此操作,因此人们对使用如此大的数字并获得平均值的任何建议将不胜感激。由于我使用的是 ^-0.1 而不是 ^-1 的权重,因此它不会下降得那么快 - 与原始点的权重 1 相比,第 100 万个点的权重仍然为 0.25,所以我不能只是削减它当它变大时关闭。
希望这已经足够清楚了吗?
这是下面答案的代码(所以可以格式化?):
data = load('/Users/mmanary/Documents/test/insertion.txt');
data=data.';
total=length(data);
x=1:total;
datapad=[zeros(1,total) data];
weights = ([(total+1):-1:2 1:total]).^(-.4);
weights = weights/sum(weights);
Fdata = fft(datapad);
Fweights = fft(weights);
Fresults = Fdata .* Fweights;
results = ifft(Fresults);
results = results(1:total);
plot(x,results)