Чрезвычайно большое средневзвешенное значение

Я использую 64-битный matlab с 32 гб оперативной памяти (просто чтобы вы знали).

У меня есть файл (вектор) из 1,3 миллиона чисел (целых). Я хочу создать другой вектор той же длины, где каждая точка является средневзвешенным значением всего первого вектора, взвешенным по обратному расстоянию от этой позиции (на самом деле это позиция ^-0.1, а не ^-1, но для примера). Я не могу использовать функцию matlab 'filter', потому что она может усреднять только то, что находится перед текущей точкой, верно? Чтобы объяснить более понятно, вот пример с 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).

Я мог бы просто переделать вектор весов для каждой точки, а затем вычислить вектор результатов элемент за элементом, но это требует 1,3 миллиона итераций цикла for, каждая из которых содержит 1,3 миллиона умножений. Я бы предпочел использовать прямое умножение матрицы, умножая 1x1.3mil на 1.3milx1.3mil, что теоретически работает, но я не могу загрузить матрицу такого размера.

Затем я пытаюсь создать матрицу с помощью сценария оболочки и проиндексировать ее в matlab, чтобы за один раз вызывался только соответствующий столбец матрицы, но это также занимает очень много времени.

Мне не нужно делать это в matlab, поэтому любые советы людей по использованию таких больших чисел и получению средних значений будут оценены по достоинству. Поскольку я использую вес ^-0.1, а не ^-1, он не падает так быстро - миллионная точка все еще взвешена на 0.25 по сравнению с исходным весом точки в 1, так что я не могу просто отрезать ее по мере того, как она становится большой.

Надеюсь, это было достаточно понятно?

Вот код для ответа ниже (чтобы его можно было отформатировать?):

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)
11
задан Community 22 September 2017 в 17:44
поделиться