Philipp Kraus wrote:
> Es sind topologische Strukturen, die ich abbilden will
> Ich bezeichne Adjazenzstrukturen (Listen & Matrizen) für die
> Repräsentation von Graphen
> im Rechner. Ich arbeite überwiegend mit den Adjazenzmatrizen, weil auf
> diese numerische
> Algos anwenden kann
Ist das Beispiel, etwa für den Graphen,
({A,B,C,D}, {(A,B), (A,C), (B,D)}
so richtig?
|A B C D
--+---------
A | 0 1 1 0
B | 0 0 0 1
C | 0 0 0 0
D | 0 0 0 0
Kann man da nicht Platz sparen, indem man nur die Einsen
speichert und die Algorithmen entsprechend modofiziert?
(Siehe weiter unten)
Wie ist die Topologie definiert. Ist das eine "Topologie"
im mathematischen Sinne?
http://de.wikipedia.org/wiki/Topologischer_Raum#Definition
Ist das die einzige Topologie? Ich hatte vermutet deine Hypercubes sind
topologisch.
>> * Was ist "Dimension"?
>
> Ich hab in den meistenfällen einen (Pseudo)-Vektorraum gegeben der als
> R^n bzw C^n definiert
> werden kann, wobei n dann die Dimension ist.
Das ist Vektorraumdimension. Da die "Dimension" dynamisch ist, sind deine
Vektorräume eigentlich R[X] und C[X], jeweils der (unendlich-dimensionale)
Vektorraum der reelen und komplexen Polynome. Übrigens ein echter Vektorraum und
nicht "Pseudo-".
Da die Anzahl der Spalten einer Tabelle in einer Datenbank stets fest ist
(bzw. fest sein sollte), musst du deine Vektoren auf immer mehrere Tupel verteilen:
Das einfachste Schema ist
Vector(vid, cid +-> value) // für R^{*} -- die "Wörter" aus reelen Zahlen ;-)
oder
Vector(vid, cid +-> realpart, imgpart) // für C^{*}
Das "+->" trennt Primärschlüssel vom Rest.
Ich betrachte nur noch R^{*}. C^{*} geht sinngemäß.
Du kannst damit ganz gut lineare Algebra mit SQL machen:
Die Vektoren v1 = (2, 5, 7, 8), v2 = (1, 0, 0, 0, 0, 7) sind dann in der
Tabelle (bei nullbasiertem Koordinatenindex):
vid cid value
1 0 2
1 1 5
1 2 7
1 3 8
2 0 1
2 5 7
Beachte, dass man Nullen einfach weglassen kann.
Zum effizienten Rechnen (effizienten Zugrif auf einzelne Vektoren)
müsstest Du noch einen (nicht unique) Index für das Attribut vid anlegen.
Dann geht:
Auswahl eines Vektors vi:
SELECT cid, value FROM Vector WHERE vid=i;
Summe: v1 + v2
SELECT cid, SUM(value) as value
FROM Vector
WHERE vid IN (1,2)
GROUP BY cid
HAVING SUM(value)!= 0.
Der Having-Teil ist optional und entfernt (überflüssige) Nullen.
Skalarprodukt v1*v2:
SELECT SUM(V1.value * V2.value) as value
FROM Vector V1, Vector V2
WHERE V1.vid = 1 AND V2.vid = 2 AND V1.cid = V2.cid
etcetc.
Du kannst auch dünn besetzte Matrizen als Relation darstellen:
Matrix(mid, row, col +-> value)
Bedenke: Eine Matrix ist ebenfalls ein Vektor. Die Koordinaten-id ist
halt nicht mehr nur eine Zahl cid sondern ein Zahlenpaar (row,col).
Damit kann man die Adjazenzmatrix so speichern:
mid row col value
1 A B 1
1 A C 1
1 B D 1
und ebenfalls die Nullen weglassen.
A, B, C können auch Zahlen (Zeilen-Spalten-Nummern) sein.
Dann kannst Du sogar mit SQL eine Vektor-Matrix-Multiplikation und Matrizenmultiplikation
machen (MIT JOIN und GROUP BY). Hier dürfte aber wieder ein Index jeweils für
(mid) -- die Matrix-id, (mid,row) und (mid,col) angebracht sein.
Ein gutes DBMS sollte diese lineare Algebra effizient durchführen können.
Vergiss nicht die Indexe. Die "Koordinatentupel" dürften auf der Festplatte
in aufeinanderfolgenden Seiten gespeichert sein und somit beim Abarbeiten der
Anfragen "en block" in den Speicher geladen werden. Das heißt, dieses
"Ein-Tupel-pro-Kooridnate" Schema dürfte recht effizient abgearbeitet werden.
Alternativ könntest Du deine Vektoren "clustern":
Vector(vid, cid +-> val0, val1, ... , valb) // für R^{*}
cid ist dann "Clusterid": bei Clustergröße 2, also b=1 sehen
v1 und v2 dann so aus:
vid cid val0 val1
1 0 2 5
1 1 7 8
2 0 1 0
2 2 0 7
Die Anfragen werden dann aber erheblich umständlicher. Ob das
schneller geht solltest Du testen. Ich vermute, der Gewinn dürfte
in keinem günstigen Verhältnis zur schlechteren Wartbarkeit des
Programms stehen. Beachte, dass die Koordinatenzahl immer Vielfache
von der Clustergröße sind. Damit brauchst Du eine zweite Tabelle, in der
die Vektordimension (Länge des Koordinatentupels) abgespeichert ist.
Umständlich!
>> * Warum genau kann ein Cube nicht relational dargestellt werden?
>
> Mir ist aktuell keine Möglichkeit bekannt wie ich "effizient" einen
> n-dimensionalen
> Vektorraum in eine relationelle Darstellung überführen kann, wobei das n
> dann
> frei durch die Anwendung definierbar ist.
>
> Ich kann zwar die Dimensionalität als Spalten definieren und die Zeilen
> einer Tabelle
> als dann einzelne Vektoren, nur die Spaltenanzahl lässt sich nicht
> dynamisch anpassen.
Ich habe gerade einen Vorschlag gemacht. Ich vermute, er ist effizient
genug. Jedenfalls ist er sehr klar und dies erleichtert die Wartbarkeit
deiner Software.
>> * Was ist ein "Sternschema"? (In der Topologie ist "Stern" oft ein
>> Synonym für eine minimale Umgebung)
>
> Sorry, mein Fehler ich hätte hier etwas präzisier formulieren müssen.
OK. Das ist dann nicht der Stern der Topologen.
>> Für dimensionsunabhängige Topologie kannst Du jedes relationale DBMS
>> benutzen, das die transitive Hülle einer Relation berechnen kann.
>> In PostgreSQL geht das z.B. mit WITH RECURSIVE Queries.
>> Ohne transitive Hülle ist deine (topologische) Dimension prinzipiell
>> nach oben beschränkt.
>
> Das habe ich gesehen, habe ich mich aber noch nicht im Detail für die
> Anwendung eingelesen.
>
> Es geht unter anderem in meiner Anwendung um zelluläre Automaten (
> http://de.wikipedia.org/wiki/Zellulärer_Automat )
> wobei ich eben eine "sinnvolle" Darstellung den kompletten Zustandsraum
> benötige. Da ich in der Datenbank
> unterschiedliche Automaten habe, soll die Dimensionalität flexibel sein.
> Als zweites Problem kommen eben GPS Daten hinzu, wobei ich im Grunde
> nicht die wirklichen Positionen brauche,
> sondern im Grunde nur die Distanz zwischen zwei Punkten, was dann
> letztendlich eine Matrix ergibt.
>
> Ich "füttere" meine Automaten mit den Distanzdaten und möchte die
> Zustände der Automaten in der Datenbank speichern
> Es geht um Simulationen, wobei eben die konkrete Struktur der Daten
> durch die Simulation vorgegeben wird.
Das ist alles sehr vage. Zelluläre Automaten sind nicht mein Thema.
Dazu kann ich leider nichts sagen.
> Vielen Dank und ich freue mich auf eine Antwort
Hoffe ich konnte helfen. War leider keine Topologie -- nur LA.
> Phil
Norbert