Hallo zusammen,
ich bin auf der Suche nach einer guten Vektorklasse für Delphi. Bislang habe ich nur eine kommerzielle Version (
http://www.lohninger.com/mathpack.html) gefunden, die aber schonmal in die Richtung geht, wie ich das gerne hätte.
Ich verarbeite in Delphi Messreihen im Umfang 10^2 bis 10^6 (das kann die Lightversion von o.g. Komponente leider schon nicht in der Lightversion), benötige Berechnungen wie Mean, Std, Sum, Min/Max, etc., sowie Berechnungen mit anderen Vektoren und Skalaren (elementweise/vektorielle Multiplikation, Addition, Subtraktion, etc).
Dazu wären Operationen wie gezieltes anfügen/füllen/löschen an bestimmten Position, Direktzugriff auf Elemente im Vektor usw., ebenfalls wünschenswert.
Ich stelle mir das ungefähr so vor:
Delphi-Quellcode:
TVector = class
private
FLength : integer;
function GetElement(Index : integer);
procedure SetElement(Index : integer; AElement : double);
procedure SetLength(NewLength : integer);
[...]
public
// Speicherbelegung & Aufräumen hier erledigen:
constructor Create(Sender : TObject; InitialLength : integer = 1);
destructor Destroy();
// Basis Properties
property Element[Index : integer] : double read GetElement write SetElement;
property Length : integer read FLength write SetLength;
// Berechnungen:
function Min(FromIndex, ToIndex : integer) : double;
function Sum(FromIndex, ToIndex : integer) : double;
function Mean(FromIndex, ToIndex : integer) : double;
// Einfügen/Löschen/etc
procedure FillWithValue(Value : double = 0);
procedure FillWithRandom(Mean : double = 0; Variance : double = 1);
procedure AppendAtBegin(Value : double);
procedure AppendAtEnd(Value : double);
procedure InsertAtIndex(AIndex : integer; Value : double);
procedure InsertAtPosition(AVec : TVector; MergePosition : integer);
procedure DeleteAtIndex(AIndex : integer; Value : double);
procedure DeleteFromTo(AIndexFrom, AIndexTo : integer);
// Nice-To-Have:
procedure LoadFromFile(AFileName : string);
procedure SaveToFile(AFileName : string);
[...]
end;
Kann natürlich von den Funktionen beliebig verlängert werden...
Wäre natürlich gut, wenn es so etwas bereits (frei) gäbe (ich habe weder bei Google noch bei der Boardsuche irgendwas vernünftiges gefunden - steinigt mich, falls ich da was einfaches übersehen hab
). Ich würde auch selbst programmieren, allerdings wäre dann die Frage, wie man die interne Darstellung der Zahlen (Liste, Dyn. Array, Stream?) am performantesten realisiert. Derzeit benutze ich Pointer auf dynamische Arrays:
Delphi-Quellcode:
type
TDoubleVec = array of Double;
PDoubleVec = ^TDoubleVec;
[...]
var
Vec : PDoubleVec;
begin
New(Vec);
// [...]
Dispose(Vec);
end
Habe z.B. auch mal irgendwo gehört, dass for-Schleifen über ein (großes) Array wohl nicht so besonders gut sein sollen und man stattdessen besser einen Pointer incrementieren sollte, den man zu Beginn auf das 0. Element setzt. Sowas wäre auch gut zu wissen, was man da noch "rausholen" kann.
Danke schonmal für Eure Tips!
Gruß,
Jan