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