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