【问题标题】:Scheme Matrix-Operation AccumulateScheme Matrix-Operation Accumulate
【发布时间】:2021-02-06 12:08:18
【问题描述】:

我正在尝试解决一些有关方案中矩阵运算的练习。因此我有一个程序累积:

(define (accumulate operation startvalue sequence)
  (if (null? sequence)
      startvalue
      (operation (car sequence)
          (accumulate operation startvalue (cdr sequence)))))

例如:

(define (dot-product u v)
   (accumulate + 0 (map * u v)))

向量(或矩阵)被定义为列表(或列表的列表),例如

(define v (list 1 2)) ;or
(define m (list (list 3 4) (list 5 6)))

现在必须实现矩阵向量积。 我应该得到这样的东西:

  (define (matrix-vector-product m v)
    (map + <?? v ??>  m) 

有人给我提示吗?

同行

更新: 我找到了一个计算矩阵向量积的解决方案。它并没有真正遵循(map &lt;??&gt; m) 的模式,但至少它使用了已经存在的过程。

(define (matrix-vector-product v m)
  (if (not (pair? m)) '()
      (cons (dot-product v (car m)) (matrix-vector-product v (cdr m)))))

【问题讨论】:

    标签: matrix vector scheme accumulate


    【解决方案1】:

    我找到了一个解决方案 elseware,但我真的不明白它是如何工作的:

    (define (matrix-vector-product m v)
      (map (lambda (row) (dot-product v row)) m))
    

    正如我所看到的,由 lambda 表达式描述的过程将高级过程 m 的第一个参数作为参数。 显然不是整个序列,而是一个接一个地包含的对(行)。
    为什么会这样?

    Map 需要一个过程和至少一个列表作为参数。
    这里的过程是 lambda 表达式,它计算 m 和 v 的行之间的点积,列表是 m。
    但是 m 和 v 的行之间的点积已经提供了解决方案,我没有看到任何到列表 m 的映射。

    也许有人可以解决我的困惑。

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2020-10-05
      • 2022-01-23
      相关资源
      最近更新 更多