Mit Matrizen rechnen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Wipffinder

Betreff: Mit Matrizen rechnen

BeitragDo, Apr 10, 2014 9:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Salü

Ich möchte mit Matrizen rechnen und dafür eine kleine Bibliothek erstellen. Die Rechenregeln sind mir bekannt. Jetzt weis ich aber nicht wie ich die Matrizen im Speicher halten soll. Dim Felder werden laut Doku immer global definiert. Man kann sie also nicht einfach so in einer Funktion übergeben. Würde man also Dim Felder benutzen wären die Funktionen sehr unflexibel. Mit types besteht das Problem, dass man mit dem Befehl Field nur eindimensionale Felder definieren kann, die in ihrer Länge auch noch statisch sind. Man könnte direkt in einer Datei herumrechnen, die Matrix könnte dann als Dateiname übergeben werden. Doch dass wäre wahrscheinlich zu langsam. Hat jemand eine Idee wie man eine beliebige Anzahl beliebiger Matrizen beliebiger Grösse organisieren kann?
gruss
 

Tritium

BeitragDo, Apr 10, 2014 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht würden Banks funktionieren? Dann wäre eine Matrix aus technischer Sicht die Startadresse in der Bank, und innerhalb der Bank würde eine Matrix aus einem "Header" bestehen, der die Struktur der Matrix beschreibt, gefolgt von den eigentlichen Daten der Matrix.

DAK

BeitragDo, Apr 10, 2014 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Verwende doch BlitzArrays. Im Gegensatz zu Dims können sie als lokal definiert werden und an Funktionen übergeben werden. Man kann sie auch als Field in ein Type setzen.
Nachteil: Sie sind nur eindimensional und man muss beim Funktionsheader definieren, wie groß die Arrays sind, die übergeben werden können.

Wenn du z.B. eine 4x4 Matrix haben willst, kannst du also nicht ein 4x4 Array erstellen, sondern musst ein 16x1 (oder eigentlich nur 16, da es die 2. Dimension gar nicht gibt)-Array machen.

Code: [AUSKLAPPEN]
Local foo[10]
For i=0 To 10
   foo[i] = i*3
Next

test(foo)
WaitKey

Function test(bar[10])
   For i=0 To 10
      Print(bar[i])
   Next
End Function
Gewinner der 6. und der 68. BlitzCodeCompo
 

Wipffinder

BeitragDo, Apr 10, 2014 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@Tritium
Banks scheinen dafür geeignet zu sein. Der Befehl CreateBank gibt ja einen Handle zurück der an Funktionen übergeben werden kann. Das mit dem Header würde die ganze Sache für den Benutzer der Funktion sehr einfach machen. Werd ich mir genauer anschauen.

@DAK
Das Problem ist hier das die Funktion bereits die Grösse wissen muss. Das wird aber schnell sehr ineffizient wenn man mit sehr kleinen und sehr grossen Matrizen rechnen will (z.B. Bilder) muss man die grösstmögliche angeben.

Danke für die schnelle Hilfe.

DAK

BeitragDo, Apr 10, 2014 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Aso, habe gedacht, du meinst Matrizenrechnung im Sinne von Transformationsmatrizen o.Ä., wo es üblicherweise nicht mehr als 3 verschiedene Größen gibt.

Bei variablen Größen bist du mit Banks wohl wirklich am Besten bedient.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Wipffinder

BeitragDo, Apr 10, 2014 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich will ich mit Hilfe der Singulärwertzerlegung ein Bild komprimieren. Mit Phyton gehts schon mal. Nun will ich alles selber mal durchkauen.

EDIT:

Kann mir jemand sagen was ich mit der Matrixmultiplikation von zwei komplexen Matritzen falsch mache. Das Internet schweigt sich dazu aus.
Ich ersetzte einfach die Multiplikation von zwei reellen Zahlen durch die komplexe Multiplikation, geht irgendwie nicht.

Cik = summe über alle j (Aij * Bjk)

wobei A = a+bi und B = c+di
A*B = ac - bd + i*(ad + bc)

Ich hoffe das ist verständlich genug.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group