Thema: Delphi Moving Average

Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Moving Average

  Alt 26. Aug 2008, 17:53
Sorry,

da war ein Fehler drin - ich habe ihn korrigiert.

Hier noch die Variante ohne die Funktion Mean():

Delphi-Quellcode:
function SimpleMovingAverage(data: TDoubleDynArray; n: Word): TDoubleDynArray;
var
  i: Integer;
  dSum: Double;
begin
  SetLength(Result, Length(data));
  dSum := 0;
  for i := Low(data) to High(data) do
  begin
    if i >= n then
      dSum := dSum - data[i - n];
    dSum := dSum + data[i];
    if i < n
      then Result[i] := dSum / Succ(i)
      else Result[i] := dSum / n;
  end;
end;
Denke bitte daran, dass der Code nur die Strukturierung des Problems durch Prozeduren und Funktionen zeigen soll. Getestet habe ich mit einem StringGrid ohne FixedRows.

Delphi-Quellcode:
const
  FMT = '%.1f';

procedure TDemoForm.InitButtonClick(Sender: TObject);
var
  i: Integer;
begin
  with StringGrid do
    for i := FixedRows to Pred(RowCount) do
      Cells[FixedCols, i] := Format(FMT, [Random * 100]);
end;

procedure TDemoForm.CalcButtonClick(Sender: TObject);
var
  data, sma: TDoubleDynArray;
begin
  with StringGrid do
  begin
    data := StringsToData(Cols[FixedCols]);
    sma := SimpleMovingAverage(data, 3);
    DataToStrings(sma, Cols[Succ(FixedCols)], FMT);
  end;
end;
Für FixedRows > 0 müssen die Signaturen der Konvertierfunktionen noch um einen entsprechenden skip value erweitert werden.

Freundliche Grüße
  Mit Zitat antworten Zitat