Re: Ideas for an advanced array procedure SRFI Bradley Lucier 26 Jan 2020 19:37 UTC

On 1/12/20 1:11 PM, Lucier, Bradley J wrote:
> That being said, I tried my hand as implementing some of these
> procedures using the updated SRFI-122.
>
> (define (array-inner-product sum sum-knil product a1 a2)
>     (let ((rotated-a2
>            ;; move the first index of a2 to the end,
>            ;; keeping all others the same
>            (let* ((n2 (array-dimension a2))
>                   (permutation (make-vector n2)))
>              (do ((i 1 (fx+ i 1)))
>                  ((fx= i n2)
>                   (vector-set! permutation (fx- n2 1) 0))
>                (vector-set! permutation (fx- i 1) i))
>              (array-permute a2 permutation))))
>       (array-outer-product
>        (lambda (sub1 sub2)
>          (array-fold sum sum-knil
>                      (array-map product sub1 sub2)))
>        (array-curry a1 1)
>        (array-curry rotated-a2 1))))

With the new array-rotate and array-reduce procedures I just added to
SRFI 179, this would be

(define (array-inner-product sum product a1 a2)

   ;; Assumes that both a1 and a2 are both of
   ;; dimension higher than 1.

   ;; Otherwise, must use the array-reduce in the
   ;; following lambda.

   (array-outer-product
    (lambda (sub1 sub2)
      (array-reduce sum (array-map product sub1 sub2)))
    ;; make subarrays with the rightmost index
    (array-curry a1 1)
    ;; rotate to put the leftmost index on the right,
    ;; then make subarrays
    (array-curry (array-rotate a2 1) 1)))

But neither code will work for the usual vector x vector -> scalar inner
product.

Brad