矩阵运算?

时间:2013-04-09 01:31:12

标签: matrix scheme rows reverse operations

由于我是一名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)列和行的反向顺序

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

3 个答案:

答案 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)))

这是有效的,因为每一行只是一个项目列表。 mapreverse应用于mat中的每个项目(即每行),并返回包含新行的新列表。

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

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