0

由于我是 SCHEME 初学者,我很难弄清楚如何使用矩阵。

我不确定如何执行以下操作:

A)给定一个矩阵,返回该矩阵的维数

EX://'(2 3 4) (1 0 6)

应该为 2 行,3 列返回 (2.3)

B)反转给定矩阵中的行顺序

EX:// 给定 '((1 2) (3 5) (9 0))

反过来应该是 '((9 0)(3 5)(1 2))

C) 与 B 部分相同,但列的顺序相反

D) 列和行的倒序

提前致谢!如果有人可以提供任何帮助,这真的意味着很多!

4

3 回答 3

3

标准 R6RS 方案不提供矩阵,但某些实现可能会提供它们。自己实现它们时的常用技巧是使用向量的向量,而不是上面显示的列表列表,因为您通常不希望按顺序访问矩阵的元素,并且向量提供恒定时间访问到它们的每个元素,而列表提供对其每个元素的线性时间访问。

我的博客上有一个小型矩阵运算库;您可以通过博客上的搜索功能找到该库的用途。

于 2013-04-09T02:06:25.187 回答
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))
于 2013-04-09T14:05:41.353 回答
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应用于(即每一行)中的每个项目并返回一个包含新行的新列表reversemat

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

这是有效的,因为在上面,我们已经定义了一种反转行的方法和一种反转列的方法。如果你想两者都做,你可以把它们结合起来。

于 2013-04-10T03:38:35.457 回答