Tuesday 20 March 2018

가중 이동 평균 c


나는 신호의 이동 평균을 계산하려고 노력하고있다 신호 값을 두 배로 무작위로 업데이 트됩니다 그것을 계산하는 효율적인 방법을 찾고 있어요 시간 창 이상의 시간 가중치 평균, 실시간으로 그것을 할 수있는 내 자신, 하지만 생각보다 어렵습니다. 인터넷에서 발견 한 많은 자원 중 일부는 정기적 인 신호의 이동 평균을 계산하는 것이지만 임의의 시간에 업데이트를 수행합니다. 누구든지 좋은 리소스를 알고 있습니다. 트릭은 다음과 같습니다. void update int time, float value를 통해 무작위로 업데이트합니다. 그러나 업데이트가 시간 창에서 떨어지면 추적해야하므로 시간 N에서 호출 한 알람을 설정하여 이전 업데이트가 계산에서 다시 고려되지 않도록합니다 . 이것이 실시간으로 발생하는 경우 운영 체제에 메소드 호출을 요청할 수 있습니다. void dropoffoldestupdate int N 시간에 호출 할 시간입니다. 이것이 시뮬레이션 인 경우 운영 체제에서 도움을 얻을 수 없으며 디 수동으로 시뮬레이션에서는 실시간과 상관없는 인수로 제공된 메소드를 호출합니다. 그러나 합리적인 가정은 호출이 시간 인수가 증가하는 것과 같이 보장된다는 것입니다. 이 경우에는 다음을 수행해야합니다. 알람 시간 값의 정렬 된 목록을 유지하고 각 업데이트 및 읽기 호출에 대해 시간 인수가 알람 목록의 헤드보다 큰지 확인합니다. 알람 관련 처리가 가장 오래 걸리면 가장 오래된 업데이트가 삭제되고 머리를 제거합니다 주어진 시간 이전의 모든 알람이 처리 될 때까지 다시 확인하십시오. 그런 다음 update 호출을 수행하십시오. 실제 계산을 위해 무엇을 할 것인가를 분명히 가정했습니다. 하지만 float 메소드가 있다고 가정 할 경우에 대해 자세히 설명합니다. 값을 읽는 데 사용하는 int 시간 읽기 가능한 목표는이 호출을 가능한 효율적으로 만드는 것입니다. 따라서 read 메소드가 호출 될 때마다 이동 평균을 계산하지 않아야합니다. 대신에 마지막 upd에서 값을 미리 계산하십시오 마지막 경보 이후에 시간의 경과를 설명하기 위해 두 개의 부동 소수점 연산으로이 값을 조정할 수 있습니다. 즉, 쌓여있는 경보 목록을 처리하는 경우를 제외하고는 작업 수가 일정합니다. 이것은 아주 간단한 알고리즘이어야하며 매우 효율적입니다. 나머지 최적화 문제 중 하나는 시간 창에서 많은 수의 업데이트가 발생하면 읽거나 업데이트하지 않은 채로 오랜 시간 동안 읽은 다음 읽는 것입니다. 또는 업데이트가 발생하는 경우 위의 알고리즘은 떨어지는 업데이트의 값을 점진적으로 업데이트하는 데 비효율적입니다. 시간 창을 마지막으로 업데이트하는 경우에만 신경을 쓰므로 필요하지 않습니다. 따라서 방법이있는 경우 이전의 모든 업데이트를 효율적으로 삭제하려면 도움이됩니다. 이렇게하려면 업데이트의 이진 검색을 수행하여 시간 윈도우 전에 가장 최근의 업데이트를 찾는 알고리즘을 수정할 수 있습니다. 업데이트를 삭제해야하는 경우 삭제 된 각 업데이트의 값을 점차적으로 업데이트 할 수 있습니다. 그러나 삭제해야하는 업데이트가 많은 경우 이전 업데이트를 삭제 한 후 값을 처음부터 다시 계산할 수 있습니다. 증분 계산에 대한 도움말 문장에서 위의 증분 계산을 의미하는 것은 마지막 업데이트 이후 시간 경과를 고려한 부동 소수점 연산 두 개로이 값을 조정하여 초기 비 증분 계산입니다. 다음으로 증가하는 순서로 관련 업데이트를 반복합니다. 최종 결과 합계 lastupdate 정확히 하나의 업데이트가 창에서 떨어지지 만 새 업데이트가 도착하지 않으면 sum을 as로 조정하십시오. 그것이 마지막 창 시작의 시작으로 수정 된 그것의 타임 스탬프를 가지고있는 priorupdate임을 주목하십시오. 그리고 정확하게 하나의 업데이트가 창에 들어가지만 새로운 업데이트가 떨어지면, sum을 as로 조정하십시오. 명백한 것처럼, 이것은 대략적인 스케치입니다 만, 상환 기준에 따라 업데이트 당 O 1 작업이되도록 평균을 유지할 수 있습니다. 그러나 이전 단락의 추가 최적화에 유의하십시오. 이전 답변에서 언급 한 안정성 문제에 유의하십시오. 즉, 부동 소수점 오류가 많은 수의 증분 근사값이 좋고 샘플 사이에 최소 시간이 있으면 수퍼 샘플링을 시도 할 수 있습니다. 균등 간격의 시간 간격을 나타내는 배열이 있어야합니다. 최소 기간보다 짧고, 각 기간마다 최신 샘플을 저장하십시오. 간격이 짧을수록 평균값이 실제 값에 가까워집니다 e 기간은 최소한 절반 이하이거나 표본을 놓칠 기회가 있어야합니다. 응답 12 월 15 일 18 일 12. 답변 12 월 15 일 11 월 22 일 38. 답변 감사합니다. 실제로 개선이 필요합니다. 우리가 항상 반복하지 않도록 합계 평균의 값을 캐시하십시오. 또한, 사소한 점이 될 수 있지만, 값을 저장하기 위해 deque 또는 목록을 사용하는 것이 더 효율적이지 않을 것입니다. 업데이트가 올 것이라고 가정하기 때문입니다 올바른 순서로 삽입은지도보다 빠릅니다 Arthur Dec 16 11 at 8 55. 예, 당신은 합계의 값을 캐시 할 수 있습니다. 지우는 샘플의 값을 빼고 삽입 한 샘플의 값을 더하십시오. deque pair 샘플, 날짜가 더 효율적일 수 있습니다. 가독성을 위해 맵을 선택했으며 맵의 상한 호출의 용이함 항상 올바른 코드를 먼저 작성한 다음 증분 변경을 프로파일 링하고 측정합니다. Rob Dec 16 11 at 15.00.Note 분명히 이것은 아닙니다. 이 방법에 접근하는 방법이 ap에 무엇이 잘못되었는지에 대한 참조를 위해 여기에 남겨 둡니다. proach 의견을 확인하십시오. UPDATED - Oli의 의견에 기반하여 그가 말하는 불안정성에 대한 확신이 없습니다. 값에 대한 도착 시간의 정렬 된지도를 사용하여 값이 도착하면 정렬 된지도에 도착 시간을 추가합니다. 가치와 이동 평균을 업데이 트하십시오. 이것은 의사 코드입니다. 완전히 밖으로 fleshed하지만 당신은 아이디어를 얻을. 주목할 사항 내가 위의 pseudo 코드입니다 말했듯이 적절한지도를 선택해야합니다. 당신은 iterator를 무효화하고 다시 시작해야하므로 반복합니다. 또한 아래의 Oli의 주석을 참조하십시오. 응답 12 월 15 일 11시 12 월 22 일. 이 방법은 각 값의 window-length가 차지하는 비율을 고려하지 않습니다 또한, 덧셈과 뺄셈에 대한이 접근법은 부동 소수점 형에 대해서만 안정적입니다. Oliver Charlesworth 12 월 15 일 12시 29 분. OliCharlesworth - 설명에서 몇 가지 주요 요점을 놓쳐서 죄송합니다. 15 11 at 12 33. 시간 가중치는 또 다른 문제입니다. 그러나 제가 말하는 것은 아닙니다. 새로운 가치가 처음으로 시간 창에 입력되면 평균에 대한 기여도는 최소라는 사실을 언급하고 있습니다. 기여도는 새로운 가치 올리버 찰스 워스 12 월 15 일 12시 35 분에 입력하십시오. 나는 이것이 부스트와 per. But으로 얻을 수 있다는 것을 알고 있지만 내가 정말로 봤 거든 부스트를 사용하지 않도록하고 어떤 적합하거나 읽을 수있는 예제를 찾을 수 없습니다. 기본적으로 나는 가장 최근 1000 개의 숫자를 데이터 샘플로 사용하는 부동 소수점 스트림의 진행중인 스트림의 평균입니다. 이를 달성하는 가장 쉬운 방법은 무엇입니까? 순환 배열, 지수 이동 평균 및보다 간단한 이동 평균을 사용하여 실험했습니다. 순환 배열의 결과가 내 요구에 가장 적합하다는 것을 알았습니다. Jun 12 12 at 4 38. 필요에 따라 간단히 지수 이동 평균을 시도해보십시오. 단순히 누적 변수를 만들고 대구로 e는 각 샘플을보고, 코드는 누적기를 새 값으로 업데이트합니다. 0과 1 사이의 상수 알파를 선택하고 이것을 계산합니다. 주어진 샘플의 효과가 지속되는 알파의 값을 찾아야합니다 약 1000 샘플입니다. 음, 실제로 이것이 당신에게 적합하다는 것을 나는 확신하지 못했습니다. 이제 여기에 넣었습니다. 문제는 1000이 지수 이동 평균에 대한 꽤 긴 창입니다. 나는 퍼질 알파가 있는지 확신하지 못합니다. 부동 소수점 계산에서 언더 플로우가없는 지난 1000 개의 숫자에 대한 평균. 그러나 30 개의 숫자 또는 그와 같은 더 작은 평균을 원한다면, 이것은 매우 쉽고 빠른 방법입니다. 6 월 12 일 12시 44 분 1 지수 이동 평균은 알파를 허용 할 수 있습니다. 따라서 시간 기반 평균 (예 : 바이트 / 초)을 계산하는 데 사용할 수 있습니다. 마지막 누적 기 업데이트 이후의 시간이 1 초 이상이면 알파를 1 0으로 설정합니다. 그렇지 않으면 , 마지막 업데이트 이후 알파를 사용 가능하게 할 수 있습니다 1000000 jxh 6 월 12 일 12시 6 월 21 일. 기본적으로 최근 1000 개의 숫자를 데이터 샘플로 사용하여 부동 소수점 스트림의 진행중인 스트림의 이동 평균을 추적하려고합니다. 아래에서 추가 된만큼 요소가 합계로 업데이트됩니다. 합계를 계산하기 위해 값 비싼 ON 탐색을 피함 - 평균 온 디맨드에 대해 필요함. T는 지원할 때 T와는 다른 매개 변수로 만들어 짐. 예 : 1000 초 길이의 long long, char의 int 또는 total float 이것은 numsamples가 INTMAX를 지나칠 수 있다는 점에서 약간의 결함이 있습니다. - 부호없는 long long을 사용하거나 여분의 bool 데이터 멤버를 사용하여 컨테이너가 처음 채워 졌을 때 레코드하는 것이 좋습니다. 무해한 pos. answered 6 월 12 일 12시 19.one 그 void operator T sample은 실제로 void 연산자 T sample oPless 6 월 8 일 14시 11 분 52 초로 가정합니다. oPhone ahhh 실제로 잘 보입니다. 물론 당신은 whate를 사용할 수 있습니다. 당신이 좋아하는 ver 표기법을 고칠 것입니다, Tony D Jun 8 14 at 14 27. 샘플 윈도우가 필요없이 C로 이동 평균을 구현하는 것이 가능합니다. 나는 윈도우를 선택하여 비트를 최적화 할 수 있음을 발견했습니다 크기를 나누기 대신 비트 이동을 허용하는 2의 거듭 제곱이지만 버퍼가 필요하지 않은 것은 좋을 것입니다. 이전 결과와 새 샘플의 함수로만 새로운 이동 평균 결과를 표현하는 방법이 있습니까? 예를 들어, 이동 평균 4 개 샘플 창에서 새 샘플 추가 eA 이동 평균은 재귀 적으로 구현 될 수 있지만 이동 평균의 정확한 계산을 위해서는 합계에서 가장 오래된 입력 샘플 즉 예제의 a를 기억해야합니다 길이 N 이동 평균에 대해 당신은 계산합니다. 여기서 yn은 출력 신호이고 xn은 입력 신호입니다. Eq 1은 재귀 적으로 쓸 수 있습니다. 따라서 항상 계산을 위해 샘플 x nN을 기억해야합니다. 2. Conrad 터너, 당신은 무한히 긴 지수 창을 사용할 수 있습니다. 광고를 사용하면 과거의 출력과 현재 입력에서 나온 결과 만 계산할 수 있습니다. 그러나이 값은 표준 가중 이동 평균이 아니라 지수 가중 이동 평균입니다. 과거의 샘플은 더 작은 가중치를 가지지 만 적어도 이론 당신은 결코 과거에 샘플에 대해 가중치가 작아지고 작아지는 것을 결코 잊지 않습니다. 나는 쓴 GPS 추적 프로그램에 대한 개별 아이템 메모리없이 이동 평균을 구현했습니다 .1 샘플로 시작하여 1로 나눠 현재 평균 그런 다음 anothe 샘플을 추가하고 현재 평균에 2로 나눕니다. 평균의 길이가 될 때까지 계속됩니다. 이후에 새 샘플을 추가하여 평균을 구한 다음 평균에서 평균을 제거합니다. 나는 수학자가 아니지만 이것을 할 수있는 좋은 방법처럼 보였다. 나는 진짜 수학자의 위장을 돌릴 것이라고 생각했다. 그러나 그것은 그것이 받아 들일 수있는 방법 중 하나이다. 그리고 그것은 잘 작동한다. 길이가 길수록 느려집니다. 당신이 따르기를 원하는대로 따라합니다. 대부분의 시간에는 문제가되지 않지만, 위성을 따라갈 때, 느리게하면 실제 위치에서 멀리 떨어져있을 수 있습니다. 그러면보기가 좋지 않을 것입니다. 위성과 트레일 링 사이에 간격이있을 수 있습니다 도트 나는 적절하게 매끄럽게하기 위해 분당 6 번 업데이트 된 15 개의 길이를 선택했고 매끄러운 트레일 도트를 사용하여 실제 앉은 위치에서 너무 멀리 떨어지지 않았습니다. 11 월 16 일 23시 03.00 초 총 0 개를 볼 때마다 0을 세웁니다. 새로운 값. 그 다음에 하나의 입력 scanf, 하나의 합계 newValue, 하나의 증분 카운트, 하나의 평균 평균 합계를 나눕니다. 이것은 모든 입력에 대해 이동 평균입니다. 마지막 4 개의 입력에 대해서만 평균을 계산하려면 4 개의 입력 변수가 필요합니다. 이전 입력 변수에 각 입력을 복사 한 다음 4 개의 입력 변수의 합계를 4 개의 오른쪽 시프트로 나눈 값으로 새로운 이동 평균을 계산하면 모든 입력이 양수 일 경우 평균 계산이됩니다. 답 2 3 월 15 일 4 06. 그것은 실제로 ca 일 것입니다. 이동 평균이 아닌 전체 평균을 계산합니다. 새 계수가 커지면 새 입력 샘플의 영향이 사라집니다. Hilmar 2 월 3 일 15시 13 분 53 초. 답변 2011 년 Stack Exchange, Inc.

No comments:

Post a Comment