2017-12-31 179 views
0

私はschemeに新しく、Schemeの行列に問題があります。私は1つの大きな正方形行列と1つの小さな正方行列を取る関数を作成する必要があります(条件付き:小さい方の長さは大きなものの除数である必要があります)、小さな行列で大きな行列を操作して新しい行列を作成します。私は正常に大規模な行列を私が望む大きさに分割し、結果を得るために正常に操作しています。ここで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))のような出力をフォーマットしたい。どうしたらいいですか?前もって感謝します。


問題を正しく説明できないことがわかりました。私がしたいのは、2つの異なる正方行列を1つの大きな行列と1つの小さな行列にする関数です。大きな行列を小さい行列と同じサイズに分割し、大きい行列の場合はm/nの新しい行列を作成します小さいものは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

あなたは一度にあまりにも多くをやろうとしていると思います。より大きな問題を小さな問題に分割することは常にOKです。

あなたのことを理解していれば、2つの正方形のマトリックスを取り、そのうちの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)) 

私はこのことが望ましいと仮定して引き続き説明します。

2つの行列が同じサイズの場合、単純なネストされたmapはすべての要素を簡単に結合することに注意してください。残っているのはサイズの違いです。 それを解決し、あなたは金色です。

要約:

(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 

幸運:

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

は今、あなたは2つの小さな破片に問題が壊れています!

+0

答えをいただきありがとうございます。上記の問題が適切に説明されていないことに気付きました。異なるサイズの行列を操作する必要があると言いましたが、異なるサイズの行列を作成する必要があります。 – BrokenFrog