由於我是一名初學者,我很難搞清楚如何使用矩陣。矩陣操作?
我關於如何執行以下操作不確定:
A)給定一個矩陣,返回的尺寸所述基質
EX://「(2 3 4) (1 0 6)
應返回(2.3)爲2行,三列
B)反向在給定的矩陣的行的順序
EX://給定「((1 2) (3 5) (9 0))
反向應該是 「((9 0)(3 5)(1 2))
C)同B部分但反向的列順序而不是
D)反向排列的行和列
在此先感謝!如果有人能夠提供任何幫助,這真的意味着很多!
由於我是一名初學者,我很難搞清楚如何使用矩陣。矩陣操作?
我關於如何執行以下操作不確定:
A)給定一個矩陣,返回的尺寸所述基質
EX://「(2 3 4) (1 0 6)
應返回(2.3)爲2行,三列
B)反向在給定的矩陣的行的順序
EX://給定「((1 2) (3 5) (9 0))
反向應該是 「((9 0)(3 5)(1 2))
C)同B部分但反向的列順序而不是
D)反向排列的行和列
在此先感謝!如果有人能夠提供任何幫助,這真的意味着很多!
標準R6RS方案不提供矩陣,但有些實現可能提供矩陣。自己實現它們時的常用技巧是使用向量的向量,而不是像上面所示的列表列表,因爲您通常不想按順序訪問矩陣的元素,向量提供常量訪問到他們的每個元素,而列表提供線性時間訪問他們的每個元素。
我有一個矩陣運算的小型庫my blog;您可以在博客中使用該庫與搜索功能。
這對於列表操作而言非常簡單 - 因爲您的矩陣表示只不過是一個子列表列表!這顯然是一項家庭作業,所以你最好試着用你自己的方式來解決它。但我可以給你一些提示和測試案例:
(define (dimensions m)
(cons <???> <???>)) ; length of m and length of m's first row
(dimensions '((2 3 4) (1 0 6)))
; => (2 . 3)
(define (reverse-rows m)
<???>) ; just reverse the list
(reverse-rows '((1 2) (3 5) (9 0)))
; => '((9 0)(3 5)(1 2))
(define (reverse-columns m)
<???>) ; reverse each of the sublists. Hint: use `map`
(reverse-columns '((1 2) (3 5) (9 0)))
; => '((2 1) (5 3) (0 9))
(define (reverse-columns-rows m)
<???>) ; call previous procedures, the ouput of one is the input of the other
(reverse-columns-rows '((1 2) (3 5) (9 0)))
; => '((0 9) (5 3) (2 1))
(define dimensions
(λ (mat)
(cons (length mat) (length (car mat)))))
這工作,因爲矩陣表示爲行的列表,每一行是一個列表。所以,(length mat)
是行數。由於每行都被表示爲其列中所有項目的列表,因此只需找出其中一行中有多少個元素,就可以找出有多少列。爲了簡單起見,您可以查看第一行:(length (car mat))
。
(define reverse-rows reverse)
這是有效的,因爲矩陣只是一個行列表。因此,您可以將reverse-rows
綁定到用於反轉任何列表的標準過程。
(define reverse-columns
(λ (mat)
(map reverse mat)))
這是有效的,因爲每一行只是一個項目列表。 map
將reverse
應用於mat
(即每行)中的每個項目並返回一個包含新行的新列表。
(define reverse-rows-columns
(λ (mat)
(reverse-rows (reverse-columns mat))))
這是因爲上面的原因,我們已經定義了一種方法來反轉行和反向列的方式。如果你想做到這一點,你可以將它們結合起來。
如果您的矩陣表示爲列表清單,您可以使用標準清單操作完成所有這些操作。 – molbdnilo 2013-04-09 08:31:01