Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 从已知移动平均线反向计算原始数据_Matlab_Moving Average - Fatal编程技术网

Matlab 从已知移动平均线反向计算原始数据

Matlab 从已知移动平均线反向计算原始数据,matlab,moving-average,Matlab,Moving Average,我试图估算(未知)原始数据点,这些数据点用于计算(已知)移动平均线。然而,我确实知道一些原始数据点,我不知道如何使用这些信息 我使用的是答案中给出的方法:,但使用的是MATLAB(我的代码如下)。这种方法对于大量数据点(>1000)非常有效,但对于较少的数据点,效果不如预期 window = 3; datapoints = 150; data = 3*rand(1,datapoints)+50; moving_averages = []; for i = window:size(data,2)

我试图估算(未知)原始数据点,这些数据点用于计算(已知)移动平均线。然而,我确实知道一些原始数据点,我不知道如何使用这些信息

我使用的是答案中给出的方法:,但使用的是MATLAB(我的代码如下)。这种方法对于大量数据点(>1000)非常有效,但对于较少的数据点,效果不如预期

window = 3;
datapoints = 150;
data = 3*rand(1,datapoints)+50;
moving_averages = [];
for i = window:size(data,2)
    moving_averages(i) = mean(data(i+1-window:i));
end

length = size(moving_averages,2)+(window-1);
a = (tril(ones(length,length),window-1) - tril(ones(length,length),-1))/window;
a = a(1:length-(window-1),:);
ai = pinv(a);

daily = mtimes(ai,moving_averages');

x = 1:size(data,2);
figure(1)
hold on
plot(x,data,'Color','b');
plot(x(window:end),moving_averages(window:end),'Linewidth',2,'Color','r');
plot(x,daily(window:end),'Color','g');
hold off
axis([0 size(x,2) min(daily(window:end))-1 max(daily(window:end))+1])
legend('original data','moving average','back-calculated')

现在,假设我知道一些原始数据点。我很难弄清楚如何使用这些信息来更准确地计算其余的。感谢您的帮助。

如果您在任何时候都能准确地确定一个窗口的数据值,即在这种情况下,在长度为n的窗口中有n-1个样本,您应该能够准确地计算原始数据。(在你的例子中)如果你知道A,B和(A+B+C)/3,你现在就可以解,知道C。现在当你有了(B+C+D)/3(你的移动平均线)你就可以精确地解出D。冲洗并重复。这一逻辑也适用于倒退

以下是一个示例:

您可以看到重建误差非常小,即使使用示例中的数据大小(150个样本和3个样本的移动平均值)

% the actual vector of values
a = cumsum(rand(150,1) - 0.5);

% compute moving average
win = 3;  % sliding window length
idx = hankel(1:win, win:numel(a));
m = mean(a(idx));

% coefficient matrix: m(i) = sum(a(i:i+win-1))/win
A = repmat([ones(1,win) zeros(1,numel(a)-win)], numel(a)-win+1, 1);
for i=2:size(A,1)
    A(i,:) = circshift(A(i-1,:), [0 1]);
end
A = A / win;

% solve linear system
%x = A \ m(:);
x = pinv(A) * m(:);

% plot and compare
subplot(211), plot(1:numel(a),a, 1:numel(m),m)
legend({'original','moving average'})
title(sprintf('length = %d, window = %d',numel(a),win))
subplot(212), plot(1:numel(a),a, 1:numel(a),x)
legend({'original','reconstructed'})
title(sprintf('error = %f',norm(x(:)-a(:))))