Matrix 矩阵运算?

Matrix 矩阵运算?,matrix,scheme,rows,reverse,operations,Matrix,Scheme,Rows,Reverse,Operations,由于我是一名方案初学者,我很难弄清楚如何使用矩阵 我不确定如何执行以下操作: A) 给定一个矩阵,返回该矩阵的维数 例:/'(2 3 4) (106) 应返回(2.3),用于两行三列 B) 颠倒给定矩阵中行的顺序 EX://given'((1-2) (3 5) (9.0)) 反之亦然 “((90)(35)(12)) C) 与B部分相同,但列的顺序相反 D) 列和行的相反顺序 提前谢谢!如果有人能提供任何帮助,这真的意义重大 标准R6RS方案不提供矩阵,尽管有些实现可能提供矩阵。当您自己实现它们时

由于我是一名方案初学者,我很难弄清楚如何使用矩阵

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

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

例:/'(2 3 4) (106)

应返回(2.3),用于两行三列

B) 颠倒给定矩阵中行的顺序

EX://given'((1-2) (3 5) (9.0))

反之亦然 “((90)(35)(12))

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

D) 列和行的相反顺序


提前谢谢!如果有人能提供任何帮助,这真的意义重大

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


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

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


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

这在列表操作方面非常简单,因为您的矩阵表示只不过是子列表的列表!这显然是一个家庭作业,所以你最好用你自己的方法解决它。但我可以给你一些提示和测试用例:

(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))
(定义(尺寸m)
(反对意见);m的长度和m的第一行的长度
(尺寸’((2 3 4)(1 0 6)))
; => (2 . 3)
(定义(反向行m)
) ; 把清单倒过来
(倒排"(12)(35)(90))
; => '((9 0)(3 5)(1 2))
(定义(反向列m)
) ; 反转每个子列表。提示:使用“地图”`
(倒列“((12)(35)(90)))
; => '((2 1) (5 3) (0 9))
(定义(反向列行m)
) ; 调用前面的过程,其中一个的输出就是另一个的输入
(反向列行'((12)(35)(90)))
; => '((0 9) (5 3) (2 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))
(定义(尺寸m)
(反对意见);m的长度和m的第一行的长度
(尺寸’((2 3 4)(1 0 6)))
; => (2 . 3)
(定义(反向行m)
) ; 把清单倒过来
(倒排"(12)(35)(90))
; => '((9 0)(3 5)(1 2))
(定义(反向列m)
) ; 反转每个子列表。提示:使用“地图”`
(倒列“((12)(35)(90)))
; => '((2 1) (5 3) (0 9))
(定义(反向列行m)
) ; 调用前面的过程,其中一个的输出就是另一个的输入
(反向列行'((12)(35)(90)))
; => '((0 9) (5 3) (2 1))
这是因为矩阵表示为行列表,其中每一行都是一个列表。因此,
(length mat)
是行数。由于每一行都表示为其列中所有项的列表,因此只需找出其中一行中有多少个元素,就可以知道有多少列。为简单起见,您只需查看第一行:
(长度(车垫))

这是因为矩阵只是一个行列表。因此,您只需将
反转行
绑定到用于反转任何列表的标准过程即可

(define reverse-columns
  (λ (mat)
    (map reverse mat)))
这是因为每一行只是一个项目列表。
map
mat
中的每个项目(即每行)应用
reverse
,并返回包含新行的新列表

(define reverse-rows-columns
  (λ (mat)
    (reverse-rows (reverse-columns mat))))
这是因为在上面,我们已经定义了一种反转行和反转列的方法。如果你想同时做这两件事,你可以把它们结合起来

这是因为矩阵表示为行列表,其中每一行都是一个列表。因此,
(length mat)
是行数。由于每一行都表示为其列中所有项的列表,因此只需找出其中一行中有多少个元素,就可以知道有多少列。为简单起见,您只需查看第一行:
(长度(车垫))

这是因为矩阵只是一个行列表。因此,您只需将
反转行
绑定到用于反转任何列表的标准过程即可

(define reverse-columns
  (λ (mat)
    (map reverse mat)))
这是因为每一行只是一个项目列表。
map
mat
中的每个项目(即每行)应用
reverse
,并返回包含新行的新列表

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

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

如果你的矩阵表示为列表列表,你可以用标准的列表操作非常简单地完成所有这些工作。如果你的矩阵表示为列表列表,你可以用标准的列表操作非常简单地完成所有这些工作。