2017-12-31 118 views
0

나는 scheme에 익숙하지 않고 Scheme의 matrix에 문제가있다. 하나의 크고 작은 정사각형 행렬 (조건을 가진 : 작은 길이가 큰 것의 제수이어야 함)을 취하고 작은 행렬로 큰 행렬에 연산을 수행하는 새로운 행렬을 만드는 함수를 생성해야합니다. 성공적으로 큰 매트릭스를 원하는 크기로 분할했습니다. 결과를 얻으려면 큰 매트릭스를 성공적으로 조작하고 있습니다.Scheme making matrix

(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 
     ) 
     '() 
    ) 
) 

내 계산 기능이이 같은 기능을 실행할 때 단 1 원자 값이 그래서 나에게 '(발 발 발 발),하지만 같은 출력을 제공 반환 여기

내가 그것을 어떻게입니다 '((val val) (val val))과 같은 출력을 포맷하고 싶습니다. 내가 어떻게 해? 미리 감사드립니다.


내가 제대로 문제를 설명 할 수 없다는 것을 깨달았습니다. 내가 원하는 것은 두 개의 서로 다른 정방 행렬을 하나의 큰 행과 하나의 작은 행렬로 취하는 함수입니다. 큰 행을 작은 행렬과 같은 크기로 분할하고, 큰 행렬이 있으면 크기가 m 인 새로운 행렬을 생성하기 위해 이들 행렬을 조작합니다 mxm이고 작은 것이 nxn입니다. 예 : 나는 실제로 계산 된 결과를 반환하지만 난 내 반환 이상 준 방법과 같았다 않았다

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) 
        ) 

: 나는 작은 같은 크기 이상의 큰 분할과 같은 결과를 계산해야

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) 
) 

'(5 2 4 2 2 6 4 4 4 3 5 4 2 4 6 3)는하지만 난으로 돌아 싶어 :

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

그래서 내가 분할 할 반환 목록을 분할 관리 할 수있는 방법?

+0

샘플 입력과 프로 시저의 예상 출력을 제공하십시오. –

+0

@ ÓscarLópez 샘플 입력과 출력을 제공했습니다. 희망을 명확히합니다. – BrokenFrog

답변

1

나는 너무 많은 것을 한 번에 해보려고합니다. 더 큰 문제를 작은 문제로 나누는 것은 항상 괜찮습니다.

자네가 이해한다면, 그 중 하나는 다른 차원의 배수가 될 수있는 두 개의 정사각형 매트를 가져 와서 그 요소에 대해 쌍으로 작업을 수행하는 것이다. 예를 들면 다음과 같습니다.

'((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)) 

나는 이것이 원하는 것이라고 가정합니다.

두 행렬이 같은 크기 인 경우 간단한 중첩 map은 모든 요소를 ​​쉽게 결합합니다. 남은 것은 다른 크기의 문제입니다. 해결하면 황금색입니다.

요점은 :

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

지금 당신은 두 개의 작은 조각으로 문제를 부러 :

(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 

행운을 빕니다!

+0

답변 주셔서 감사합니다, 내 문제가 제대로 위에서 설명하지 않았다는 것을 깨달았다, 당신은 내가 다른 크기의 매트릭스에서 작동해야하지만 나는 또한 지금 질문을 연장 할거야 다른 크기의 매트릭스를 만들어야한다고 말했다. – BrokenFrog