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