none
F#: Gibt es eine Möglichkeit, eine Matrix aus Funktionen zu definieren, die man dann auf einen Vektor anwendet? RRS feed

  • Frage

  • In Pseudocode angedeutet:

    let J = ((r/r * Math.Sin rho * Math.Cos phi, r/r * Math.Sin rho * Math.Sin phi, r/r * Math.Cos rho * phi/phi),
               ...

    let v = (1.73, 0.785, 0.785)

    printf(J*v)

    Also, worum es mir hier geht, ist eine Matrix (im Beispiel die 3-D-Jacobi-Matrix) definieren zu können so, dass die Elemente der Matrix Funktionen sind, die dann auf den Vektor v angewendet werden. In C# ist das ein ellenlanges Tamtam. Ich hatte gehofft (und hoffe noch), dass das in F# kompakter geht.

    LG

    Sonntag, 19. Oktober 2014 16:31

Antworten

  • Hallo,
    eine Matrix ist i.d.R. eine verschachtelung von Vektoren. Vektoren haben nur eine Dimension, Matritzen können somit aber auch mehrere haben. Deswegen bin ich mir nicht so ganz sicher wie du die Funktionen der Matrix auf den Vektor anwenden willst.

    Vielleicht hilft dir folgendes Snippet:

    open System
    
    //2D Array von Funktionen
    let f = [|
                [|Math.Sin;Math.Cos;Math.Sin|];
                [|Math.Cos;Math.Sin;Math.Cos|];
                [|Math.Sin;Math.Cos;Math.Sin|];
            |]
            
    //2D Array von Werten
    let v = [|
                [|Math.PI;Math.PI;Math.PI|];
                [|Math.PI;Math.PI;Math.PI|];
                [|Math.PI;Math.PI;Math.PI|]
            |]
    
    //Jede Funktion durchgehen und mit dem Wert an der jeweiligen Stelle berechnen
    let r = Array2D.init 3 3 (fun i j -> f.[i].[j] v.[i].[j])
    Über F#s Fähigkeit einzelne Zeilen- und Spaltevektoren abzufragen kannst du das natürlich auch auf normale Vektoren anwenden. Oder aber du arbeitest gleich mit 1D Arrays.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert CPosingies Freitag, 24. Oktober 2014 12:52
    Sonntag, 19. Oktober 2014 16:48
    Moderator
  • Hallo zusammen,

    CPosingies, bist Du anhand des von Tom angegebenen Snippets vorangekommen?

    Ich habe vor kurzem, mich auf Toms hilfreichem Ausschnitt stützend, die beschriebene Matrix in F# umgesetzt. Man hat also die Matrix J (Jacobi-Matrix für die Transformation von Kugelkoordinaten in kartesische Koordinaten), deren Elemente Funktionen des Betrags des Vektors und der Winkel ρ und φ sind (v.[0], v.[1] und v.[2]). In meinem Vorgehen habe ich die Matrix J in drei  (f, g und h) aufgeteilt, f und g für die Funktionen, h für das Multiplikand (1, r oder -r) gemäß den Formeln . Dabei ist v der Vektor:

        let v = [| 1.73 ; 0.785 ; 0.785 |]
        let l = fun x -> 1.0
        let m = fun x -> 0.0
        let f = [|
                [|Math.Sin; Math.Cos; Math.Sin|];
                [|Math.Sin; Math.Cos; Math.Sin|];
                [|Math.Cos; Math.Sin; m |]
            |]
        let g = [|
                [|Math.Cos; Math.Cos; Math.Sin|];
                [|Math.Sin; Math.Sin; Math.Cos|];
                [|l; l; m|];
            |]
        let h = [|
                [|1.0; v.[0] ; v.[0]*(-1.0) |] ;
                [| 1.0; v.[0]; v.[0] |];
                [| 1.0; v.[0]*(-1.0); 0.0 |]
            |]

    L und m sind Funktionen, die immer eins bzw. Null zurückgeben (für die Transformation der Applikate, wo man φ nicht braucht).

    Dann kann man die Jacobi-Matrix so definieren:

    let r = Array2D.init 3 3 (fun i j -> ( f.[i].[j] v.[1])*(g.[i].[j] v.[2])*h.[i].[j] )

    Grüße, Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert CPosingies Freitag, 24. Oktober 2014 12:56
    Dienstag, 21. Oktober 2014 09:26
    Moderator

Alle Antworten

  • Hallo,
    eine Matrix ist i.d.R. eine verschachtelung von Vektoren. Vektoren haben nur eine Dimension, Matritzen können somit aber auch mehrere haben. Deswegen bin ich mir nicht so ganz sicher wie du die Funktionen der Matrix auf den Vektor anwenden willst.

    Vielleicht hilft dir folgendes Snippet:

    open System
    
    //2D Array von Funktionen
    let f = [|
                [|Math.Sin;Math.Cos;Math.Sin|];
                [|Math.Cos;Math.Sin;Math.Cos|];
                [|Math.Sin;Math.Cos;Math.Sin|];
            |]
            
    //2D Array von Werten
    let v = [|
                [|Math.PI;Math.PI;Math.PI|];
                [|Math.PI;Math.PI;Math.PI|];
                [|Math.PI;Math.PI;Math.PI|]
            |]
    
    //Jede Funktion durchgehen und mit dem Wert an der jeweiligen Stelle berechnen
    let r = Array2D.init 3 3 (fun i j -> f.[i].[j] v.[i].[j])
    Über F#s Fähigkeit einzelne Zeilen- und Spaltevektoren abzufragen kannst du das natürlich auch auf normale Vektoren anwenden. Oder aber du arbeitest gleich mit 1D Arrays.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert CPosingies Freitag, 24. Oktober 2014 12:52
    Sonntag, 19. Oktober 2014 16:48
    Moderator
  • Hallo zusammen,

    CPosingies, bist Du anhand des von Tom angegebenen Snippets vorangekommen?

    Ich habe vor kurzem, mich auf Toms hilfreichem Ausschnitt stützend, die beschriebene Matrix in F# umgesetzt. Man hat also die Matrix J (Jacobi-Matrix für die Transformation von Kugelkoordinaten in kartesische Koordinaten), deren Elemente Funktionen des Betrags des Vektors und der Winkel ρ und φ sind (v.[0], v.[1] und v.[2]). In meinem Vorgehen habe ich die Matrix J in drei  (f, g und h) aufgeteilt, f und g für die Funktionen, h für das Multiplikand (1, r oder -r) gemäß den Formeln . Dabei ist v der Vektor:

        let v = [| 1.73 ; 0.785 ; 0.785 |]
        let l = fun x -> 1.0
        let m = fun x -> 0.0
        let f = [|
                [|Math.Sin; Math.Cos; Math.Sin|];
                [|Math.Sin; Math.Cos; Math.Sin|];
                [|Math.Cos; Math.Sin; m |]
            |]
        let g = [|
                [|Math.Cos; Math.Cos; Math.Sin|];
                [|Math.Sin; Math.Sin; Math.Cos|];
                [|l; l; m|];
            |]
        let h = [|
                [|1.0; v.[0] ; v.[0]*(-1.0) |] ;
                [| 1.0; v.[0]; v.[0] |];
                [| 1.0; v.[0]*(-1.0); 0.0 |]
            |]

    L und m sind Funktionen, die immer eins bzw. Null zurückgeben (für die Transformation der Applikate, wo man φ nicht braucht).

    Dann kann man die Jacobi-Matrix so definieren:

    let r = Array2D.init 3 3 (fun i j -> ( f.[i].[j] v.[1])*(g.[i].[j] v.[2])*h.[i].[j] )

    Grüße, Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    • Als Antwort markiert CPosingies Freitag, 24. Oktober 2014 12:56
    Dienstag, 21. Oktober 2014 09:26
    Moderator
  • Ihr seid Götter!

    Genau das habe ich gesucht. Und wie sind wir eigentlich ohne F# jemals zurecht gekommen? ^^

    Danke, Jungs, und schönes WE!

    Carsten

    Freitag, 24. Oktober 2014 12:56