我是计划新手,我在Scheme中遇到矩阵问题。我需要创建一个函数,它接受一个大的和一个小的正方形矩阵(条件:小的长度应该是大的矩阵的除数)并创建一个新的矩阵,对小的矩阵进行操作。我已成功地将大矩阵分割成我想要的大小,并且我已经成功地对其进行操作以获得结果。
我是这样做的:
(define (matrix-op big small x y)
(if (< y (/ (length big) (length small))))
(if (< x (/ (length big) (length small)))
(cons (calculate (split-y (split-x big small x) small y) small)
(matrix-op big small (+ x 1) y))
(matrix-op big small 0 (+ y 1)) ; <- this is where i need to split
)
'()
)
)
我的计算函数只返回1个原子值,所以当我运行这样的函数时,它给出了一个类似'(val val val val)的输出,但我想要的是将输出格式化为'((val val)(val VAL))。我该怎么做?提前谢谢。
我意识到我无法正确解释问题。我想要的是一个函数,它采用两个不同的方形矩阵,一个大,一个小,将大的矩阵分割成与较小的一个相同的大小,对它们进行操作以创建一个新的矩阵,如果大的那么大小为m / n是mxm,小的是nxn。例如:
big '( small '(
(8 0 3 1 5 3 2 2) (8 4)
(7 1 1 4 3 7 1 4) (9 5)
(1 3 7 4 3 6 6 3) )
(0 9 8 6 5 6 4 3)
(1 7 6 9 6 6 7 2)
(5 7 1 0 2 9 5 3)
(0 5 4 6 6 6 3 0)
(3 6 2 7 7 5 7 0)
)
我需要将大小与大小相同,并计算结果,如:
for x=0 y=0 part is '( calculate result is 5
(8 0)
(7 1)
)
for x=1 y=0 part is '( calculate result is 2
(3 1)
(1 4)
)
我实际上确实返回了计算结果但是我上面给出的方法我的回复就像'(5 2 4 2 2 6 4 4 4 3 5 4 2 4 6 3)
但我想回复:
'(
(5 2 4 2)
(2 6 4 4)
(4 3 5 4)
(2 4 6 3)
)
那么如何设法将返回列表拆分到我要拆分的位置?
答案 0 :(得分:1)
我认为你想要立刻做太多事情。将更大的问题分解为更小的问题总是可以的。
如果我理解你的,那么我们的想法是采用两个方形矩阵,其中一个可能是另一个维度的一些倍数,并对元素执行成对运算。例如:
'((1 2 3) '((1 2 3) '((7 7 7) '(( 8 9 10)
(4 5 6) + '((7)) --> (4 5 6) + (7 7 7) --> (11 12 13)
(7 8 9)) (7 8 9)) (7 7 7)) (14 15 16))
我将继续假设这是所希望的。
请注意,如果两个矩阵的大小相同,则简单的嵌套map
可以轻松组合所有元素。剩下的是不同尺寸的问题。
解决这个问题,你就是金色的。
回顾:
(define (f op small-M big-M)
(f-apply-pairwise-op
op
(f-biggify small-M (/ (length big-M) (length small-M)))
big-M))
现在你已将问题分成两小部分:
(define (f-apply-pairwise-op op A B) ...) ; produces pairwise 'A op B'
(define (f-biggify M n) ...) ; tile M n times wider and taller
祝你好运!