Efficient way to calculate backwards average
이전 댓글 표시
Dear all,
I'm looking for an efficient way to calculate a backwards moving average, i.e., giving a vector A I want to calculate a vector A2 for which the element i is equal to mean(A(i:end)).
For the moment I am doing it this way:
A=rand(1,1000);
n=length(A);
A2=zeros(1,n)
for i=1:n
A2(i)=mean(A(i:end));
end
Is there any better way?
Thanks
Lorenzo
채택된 답변
추가 답변 (4개)
José-Luis
2014년 9월 29일
numRows = 100;
numCols = 100;
data = rand(numRows,numCols);
result = flipud(bsxfun(@rdivide,cumsum(flipud(data)),(1:numRows)));
Chad Greene
2014년 9월 29일
0 개 추천
This is a very fast moving average calculator. It centers data, so if you use an N-point moving average, after calculating the moving averaged, you could shift by N/2 to get the "backwards" moving average.
댓글 수: 1
Image Analyst
2014년 9월 29일
He doesn't want a moving average. His window is not constant length, but gets shorter as the index approaches the end of the array.
s = sum(A);
n = length(A);
A2 = (s - cumsum(A))/n;
is a little more elegant and I would think faster. But you have to add s/N to the beginning of A2 and remove the 0 at the end of A2.
The last operation (removing the zero) is misleadingly innocent:
A2(end) = [];
But you may soon get to know the consequences of it.
댓글 수: 1
Stephen23
2014년 9월 30일
Unless you are actually answering your own question, write a comment to your original question or one of the answers. There is no guarantee that the answers remain in any particular order...
카테고리
도움말 센터 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!