我有一个X Y by X Y向量b(一个2d数组/矩阵)。此向量中的每个条目都有一个列表,其长度可以从1到X * Y元素。我想循环遍历向量的所有元素,并找出具有最小长度列表的向量的行和列(或者如果有多个返回其中一个或者所有元素也很好)。
我开始使用以下(不完整的代码)
(define (find-minimum-row-col b X Y)
(for*/first ([row (* X Y)]
[col (* X Y)]
#:when (< ( length (vector-ref (vector-ref b row) col))) the-min-sofar))
(cons row col)))
我不确定如何以功能方式跟踪运行的最小值和相应的坐标(即不使用-min-sofar变量上的set!)
答案 0 :(得分:1)
试试这个:
(define (find-minimum-row-col a)
(for*/fold ([the-min '(0 . 0)])
([row (in-range (vector-length a))]
[col (in-range (vector-length (vector-ref a 0)))])
(if (< (length (vector-ref (vector-ref a row) col))
(length (vector-ref (vector-ref a (car the-min)) (cdr the-min))))
(cons row col)
the-min)))
诀窍是使用for*/fold
在the-min
变量中累积迭代结果,并根据需要更新它。我们不必传递矩阵的维度,只要矩阵非空并且所有行具有相同的列数,所有这些都可以工作。例如:
(find-minimum-row-col '#(#((1) (2 2) (3 3 3))
#((2 2) (1) (3 3 3))
#((2 2) () (2 2))))
=> '(2 . 1)