matrix - 旋转矩阵,为什么它不能作为函数工作,但它可以在行命令中工作?
问题描述
旋转矩阵的一种方法是对其进行转置,然后反转所有行。我用两个函数解决了这个问题,map(返回转置)和 reverse(完成 90° 旋转),在控制台中我执行以下操作:
(reverse (apply map list (list (list 1 2 3 4) (list 5 6 7 8) (list 9 10 11 12) (list 13 14 15 16)))
Result: {{4 8 12 16} {3 7 11 15} {2 6 10 14} {1 5 9 13}}
没错,但是当我创建一个函数时,它不起作用。
(define (transpose2 matriz)
(reverse (apply map list matriz))
然后做:
> (transpose2 (list (list 1 2 3 4) (list 5 6 7 8) (list 9 10 11 12) (list 13 14 15) ) )
它只是抛出一个错误:
mcar:预期违反合同:mpair?给定:()
我试过导入 (srfi :41) (我也在 r6rs 上工作)但它也不起作用。不过,此函数适用于 3 x 3 矩阵。
我怎样才能解决这个问题?
解决方案
您的输入不正确。
(transpose2 (list (list 1 2 3 4)
(list 5 6 7 8)
(list 9 10 11 12)
(list 13 14 15))) ;; here are only 3 elements while in the others 4!
(transpose2 (list (list 1 2 3 4)
(list 5 6 7 8)
(list 9 10 11 12)
(list 13 14 15 16))) ;; this works flawlessly - you just forgot 16 before!
DrRacket 给出错误:
map: all lists must have same size; arguments were: #<procedure:list> '(1 2 3 4) '(5 6 7 8) '(9 10 11 12) '(13 14 15)
您使用的是哪种 Scheme 解释器?
#lang racket
(define m (list (list 1 2 3 4)
(list 5 6 7 8)
(list 9 10 11 12)
(list 13 14 15 16)))
(define (transpose2 mat)
(reverse (apply map list mat)))
(reverse (apply map list m))
(transpose2 m)
;; both give:
;; '((4 8 12 16) (3 7 11 15) (2 6 10 14) (1 5 9 13))
推荐阅读
- python - 获取库存数据问题
- swift - 如何在同一个 IBAction 中取消选择(取消突出显示)按钮
- php - 不工作使用 file_get_contents 发布数据
- github - 将使用 noreply 电子邮件更改我的 GitHub 用户名更新/删除属性
- lua - 如何在 Lua 表中查找 Corona SDK 显示对象的所有条目?
- google-maps - 我们可以在 void initState() 中插入两个方法吗?
- r - 绑定包含嵌套 data.frames 列的 r data.frames
- php - 使用硬链接时,如何防止同一文件被包含两次?
- postgresql - PostgreSQL按天分组时间戳
- rust - 为什么除了 Ord 特征之外,Rust 还需要 PartialOrd 特征?