Typen: Skalare, Vektoren und Matizen kompatibel?
-
Hallo,
ich möchte gerne eine Klasse in C++ bauen, die Daten aus einem Binaryfile ausliest. In diesem Binaryfile liegen die Daten verschiedener Meßpunkte hintereinander. Über ein Parametersetting soll der Benutzer nun bestimmen 1.welche Meßpunkte er auslesen möchte und 2. wieviele Zeitschritte.
Zum Beispiel:
lese Daten aus Messpunkt 11, 12 und 13 zu den Zeitpunkten t5,t6,t7Der Datenleser liest jeweils einen Zeitvektor (als Spaltenvektor über alle Meßpunkte). Wenn es mehrere Zeitvektoren (im Beispiel also 3 gibt), dann werden diese in einer Matrix gebündelt. Wenn ich das obige Beispiel also lesen würde bekäme ich eine 3 x 3 Matrix:
a11,t5 a11,t6 a11,t7
a12,t5 a12,t6 a12,t7
a13,t5 a13,t6 a13,t7Der Benutzer kann ja auch nur einen Meßpunkt zu verschiedenen Zeitpunkten auslesen, so dass das Ergebnis ein Zeilenvektor wäre. Das extrem wäre dass ein Zeitpunkt von einem Meßpunkt ausgelesen würde, so dass das Ergebnis ein Skalar wäre.
Meine Frage: kann ich den Rückgabetyp einfach als Matrix angeben? D.h. würde dadurch auch der Vektor und das Skalar abgedeckt? Im Prinzip sind die ja auch nichts anderes als eine Matrix: 1 x n für einen Vektor und 1 x 1 für ein Skalar.
Viele Grüße
Tranquillity
-
wie du das implementierst, bleibt eigentlich dir überlassen. aber als hinweis: ein vektor kann gern als einzeilige oder -spaltige matrix interpretiert werden, ein skalar allerdings nicht! ein skalar ist ein skalar und keine 1x1 matrix. wenn du eine 1x1 matrix mit einer anderen matrix multiplizierst, erhältst du eine 1x1 matrix (oder nichts, weils halt grad nicht passt). wenn du einen skalar mit einer n x m matrix multiplizierst, erhältst du wieder eine n x m matrix, allerdings skaliert. (frag dich mal, woher der begriff kommt ^^) wenn du also alles als matrizen behandeln willst, dann musst du skalare als sonderfall markieren. umständlich und fehleranfällig, würd ich nicht machen.
-
@thordk: Die Beschreibung dort oben sieht nicht wirklich danach aus, als ob sie Matrix-Rechnung im mathematischen Sinn durchführen will

@Tranquility: Ich würde die Daten als Matrix (bzw. 2D-Array) ausgeben - allgemeine Datensammlungen ergeben ein n*m-Array, "Zeitvektoren" ein n*1-Array, "Ortsvektoren" (verschiedene Messpunkte zur selben Zeit) ein 1*m-Array und Einzelpunkte werden in einem 1*1-Array gespeichert (ist zwar etwas Overhead, aber erleichtert die Weiterverarbeitung).
-
hm, übers ziel hinausgeschossen ^^
-
Hi !
typ matrix[m]
typ matrix[m][n]
typ matrix[m][n][o]
typ matrix[m][n][o][p]Kannst du machen und nen Zeiger auf typ ala return typ* machen, ist alles zusammenhängender Speicherbereich.
In der objektorientierten Welt allerdings würdest du ein Objekt, oder einen Zeiger auf ein Objekt zurückgeben, welches das Format bzw. die Datenstruktur deiner Wahl repräsentiert. Nicht wahr.
Ich würde da von solchen multidimensionalen Matrizen absehen und ein möglichst einfaches Format fürs Speichern und Auslesen wählen.
MfG

-
Hallo,
ich danke Euch für Eure ausführlichen und schnellen Antworten. Die Klasse selbst, soll ja nur die Daten auslesen und zwar die Meß- und Zeitpunkte die der Benutzer haben will. Das was zurückgegeben wird, wird dann jedoch von anderen Klassen weiterverarbeitet und zwar als Matrix.(Also ist das mit dem Zeiger wahrscheinlich eine sehr gute Sache)
Hinter der ganzen Sache steckt ein modularer Aufbau mit folgenden Bestandteilen:
1. Data-Reader primary component: In der gibt es secodary components die zum Auslesen von Daten aus Dateien verwendet werden. Für den Anfang wird es jedoch nur der Binary-File Reader sein, von dem ich schon sprach. Allen diesen Modulen wird gemeinsam sein, dass sie die gelesenen Files als Matrizen zurückgeben müssen in der Form, wie ich es oben mit der Matrix angedeutet habe.
2. Analysation Tool primary component: In der gibt es secondary components, die die ausgelesenen Matrizen weiterverarbeiten z.B. in dem sie eine PCA oder ICA für ein Preprocessing drüberlaufen lassen und das Ergebnis später an ein beliebig dahintergeschaltetes statistisches (oder was auch immer) Analysetool weiterleiten.
3. Coordinating Framework: dass wie der Name schon sagt die Berechnungen nach den Benutzereingaben ausführt. Der Benutzer soll ein UI verwenden von dem ich noch nicht so ganz genau weiß, wie es letztendlich aussehen wird, weil es eine Vielzahl von Parametern zu setzen gibt. Mir schwebt irgendwas zwischen GUI und TUI vor vielleicht auch mit einer CLI Option, weiß noch nicht so ganz). Die Sache ist die, dass diese Verarbeitung über zwei Modi laufen kann: global und step bei step.
Das Problem mit dem "Skalar" (@thordk du hast recht, dass kann man mathematisch nicht durcheinanderwerfen, war wohl der falsche Ausdruck, ich meinte tatsächlich so was wie eine 1 x 1 Matrix, wie du gleich sehen wirst) kann dann auftreten, wenn ich im step-by-step Modus nur einen Meßpunkt lese. Dann habe ich noch nicht einmal mehr einen Vektor, gehandelt werden muss das aber wie gehabt, da ja die Tools hier jeden Zeitschritt nacheinander rechnen.Der step-by-step modus simuliert also so etwas wie eine Online-Meßsituation. Im global Modus ist die größe der Matrix hingegen enorm (um die 65 x 2000 im Schnitt).
Es gibt noch ein paar andere Komponenten, die hier aber nicht hereinspielen. Dazu gehören zum Beispiel eine Templatelib die Templatematrizen (meist 3 x 3) beinhaltet, die Teilweise von den Tools benötigt werden oder auch Adjustment-Templates die vorgefertigte Einstellungen bereits enthalten.
Übrigens verwende ich neben der normalen C++ lib noch die IT++ oben drauf, weil da schon viele Signalverarbeitungsfunktionen dabei sind.
Wie gesagt, bin ich gerade in der Planung und werde sicherlich noch das ein oder andere zu posten haben. Danke Euch noch mal für die Möglichkeit des Austauschs...
sicherlich bis bald
Tranquillity