由于我是一名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)列和行的反向顺序
提前致谢!如果有人可以提供任何帮助,这真的意味着很多!
答案 0 :(得分:3)
标准R6RS方案不提供矩阵,但有些实现可能会提供它们。自己实现它们时的常用技巧是使用向量向量,而不是如上所示的列表列表,因为您通常不希望按顺序访问矩阵的元素,并且向量提供常量时间访问对于每个元素,列表提供对其每个元素的线性时间访问。
我在my blog有一个小型矩阵运算库;您可以在博客上找到该库与搜索功能的使用。
答案 1 :(得分: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))
答案 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))))
这是有效的,因为在上面,我们已经定义了一种反转行的方法和一种反转列的方法。如果你想两者兼顾,你可以将它们组合起来。