2013-04-09 192 views
0

由於我是一名初學者,我很難搞清楚如何使用矩陣。矩陣操作?

我關於如何執行以下操作不確定:

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)反向排列的行和列

在此先感謝!如果有人能夠提供任何幫助,這真的意味着很多!

+0

如果您的矩陣表示爲列表清單,您可以使用標準清單操作完成所有這些操作。 – molbdnilo 2013-04-09 08:31:01

回答

3

標準R6RS方案不提供矩陣,但有些實現可能提供矩陣。自己實現它們時的常用技巧是使用向量的向量,而不是像上面所示的列表列表,因爲您通常不想按順序訪問矩陣的元素,向量提供常量訪問到他們的每個元素,而列表提供線性時間訪問他們的每個元素。

我有一個矩陣運算的小型庫my blog;您可以在博客中使用該庫與搜索功能。

1

這對於列表操作而言非常簡單 - 因爲您的矩陣表示只不過是一個子列表列表!這顯然是一項家庭作業,所以你最好試着用你自己的方式來解決它。但我可以給你一些提示和測試案例:

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

這是有效的,因爲每一行只是一個項目列表。 mapreverse應用於mat(即每行)中的每個項目並返回一個包含新行的新列表。

(define reverse-rows-columns 
    (λ (mat) 
    (reverse-rows (reverse-columns mat)))) 

這是因爲上面的原因,我們已經定義了一種方法來反轉行和反向列的方式。如果你想做到這一點,你可以將它們結合起來。