2017-12-31 9 views
0

Ich bin neu zu Schema und ich habe Probleme mit Matrizen in Scheme. Ich muss eine Funktion erstellen, die eine große und eine kleine quadratische Matrix (mit der Bedingung: die Länge des kleinen sollte Teiler von großen sein) und eine neue Matrix mit einer Operation auf der großen mit kleinen machen. Ich habe die große Matrix erfolgreich auf die Größe aufgeteilt, die ich wollte, und ich arbeite erfolgreich daran, um das Ergebnis zu erhalten.Scheme Making Matrix

Hier ist, wie ich es tat:

(define (matrix-op big small x y) 
    (if (< y (/ (length big) (length small)))) 
     (if (< x (/ (length big) (length small))) 
      (cons (calculate (split-y (split-x big small x) small y) small) 
        (matrix-op big small (+ x 1) y)) 
      (matrix-op big small 0 (+ y 1)) ; <- this is where i need to split 
     ) 
     '() 
    ) 
) 

Meine berechnen Funktion gibt nur 1 Atom-Wert so, wenn ich die Funktion wie folgt ausführen es gibt mir eine Ausgabe wie ‚(val val val val), aber was Ich möchte formatiert die Ausgabe wie '((val val) (val val)). Wie kann ich es tun? Danke im Voraus.


Ich erkannte, dass ich das Problem nicht richtig erklären konnte. Was ich haben will, ist eine Funktion, die zwei verschiedene quadratische Matrizen verwendet, eine große und eine kleine, teilt die große auf die gleiche Größe wie die kleinere, bearbeitet sie, um eine neue Matrix zu erzeugen, die die Größe m/n hat ist mxm und klein ist nxn. Beispiel:

big '(      small '(
(8 0 3 1 5 3 2 2)     (8 4) 
(7 1 1 4 3 7 1 4)     (9 5) 
(1 3 7 4 3 6 6 3)     ) 
(0 9 8 6 5 6 4 3) 
(1 7 6 9 6 6 7 2) 
(5 7 1 0 2 9 5 3) 
(0 5 4 6 6 6 3 0) 
(3 6 2 7 7 5 7 0) 
) 

Ich brauche große über die gleiche Größe wie klein zu spalten und berechnen Ergebnisse wie:

for x=0 y=0 part is '(  calculate result is 5 
         (8 0) 
         (7 1) 
        ) 

for x=1 y=0 part is '(  calculate result is 2 
         (3 1) 
         (1 4) 
        ) 

ich tatsächlich die Ergebnisse berechnet zurückgegeben hat, sondern mit der Methode, die ich über meine Rückkehr gab, war wie '(5 2 4 2 2 6 4 4 4 3 5 4 2 4 6 3) aber ich wollte als zurückzukehren:

'(
    (5 2 4 2) 
    (2 6 4 4) 
    (4 3 5 4) 
    (2 4 6 3) 
) 

so wie kann ich verwalten die Rückgabeliste zu spalten, wo ich teilen möchten?

+0

Bitte geben Sie eine Beispieleingabe und die erwartete Ausgabe des Verfahrens –

+0

@ ÓscarLópez Ich gab eine Beispieleingabe und -ausgabe. Hoffe es klärt. – BrokenFrog

Antwort

1

Ich denke, Sie versuchen, zu viel auf einmal zu tun. Es ist immer in Ordnung, ein größeres Problem in ein kleineres Problem aufzuteilen.

Wenn ich deins verstehe, besteht die Idee darin, zwei quadratische Matrizen zu verwenden, von denen einige ein Vielfaches der anderen Dimensionen sein können, und eine paarweise Operation an den Elementen durchzuführen. Zum Beispiel:

'((1 2 3)     '((1 2 3) '((7 7 7)  '((8 9 10) 
    (4 5 6) + '((7)) --> (4 5 6) + (7 7 7) --> (11 12 13) 
    (7 8 9))     (7 8 9)) (7 7 7))  (14 15 16)) 

Ich werde mit der Annahme fortfahren, dass dies das ist, was gewünscht wird.

Beachten Sie, dass, wenn die zwei Matrizen die gleiche Größe hätten, ein einfaches verschachteltes map alle Elemente leicht kombinieren würde. Was übrig bleibt, ist das Problem der verschiedenen Größen. Löse das und du bist golden.

Recap:

(define (f op small-M big-M) 
    (f-apply-pairwise-op 
    op 
    (f-biggify small-M (/ (length big-M) (length small-M))) 
    big-M)) 

Jetzt haben Sie das Problem in zwei kleinere Stücke gebrochen:

(define (f-apply-pairwise-op op A B) ...) ; produces pairwise 'A op B' 

(define (f-biggify M n) ...) ; tile M n times wider and taller 

Viel Glück!

+0

Danke für die Antwort, ich erkannte, dass mein Problem oben nicht richtig erklärt wurde. Wie Sie sagten, dass ich auf Matrizen mit verschiedenen Größen operieren musste, aber ich auch eine Matrix mit einer anderen Größe machen muss, werde ich jetzt die Frage erweitern. – BrokenFrog