Clojure 函数接受顺序参数并拥有以前的值
我正在和你一起工作。更具体地说,是用于滤波和平滑的正向和反向算法。我已经确定了一个表示,并有一个向前工作的fn,它接受隐藏变量和模型的先前概率分布,并返回新的概率分布。现在我想要一个过滤函数,它接受一系列传感器状态和一个模型,并返回一个由Clojure 函数接受顺序参数并拥有以前的值,clojure,Clojure,我正在和你一起工作。更具体地说,是用于滤波和平滑的正向和反向算法。我已经确定了一个表示,并有一个向前工作的fn,它接受隐藏变量和模型的先前概率分布,并返回新的概率分布。现在我想要一个过滤函数,它接受一系列传感器状态和一个模型,并返回一个由 初始状态(包含在模型中) 在返回序列中的前一个状态、下一个传感器状态和模型上使用forward的结果 重复2次,直到不再保留传感器状态 我已经设法通过递归实现了这一点,但由于它不是尾部位置递归,它打破了递归,似乎不惯用,通常是一个糟糕的解决方案。我曾尝试将其用
(defn filtering
"Perform filtering to decide the likely state based on evidence.
Returns a sequence of state probabilities given a sequence of evidence."
[evidence {:keys [transition sense initial state-map] :as model}]
(if (empty? evidence)
(vector initial)
(let [reading (first evidence)
history (filtering (drop 1 evidence) model)
previous-state (vector (peek history))
fwd (forward previous-state reading model) ]
(conj history fwd)
)
)
)
递归首先下到
证据的末尾
并生成(:初始模型)
。这是减少的初始值
然后,递归的每个返回级别将#(正向%1%2模型)
应用于较低递归级别(如%1
,由peek
)和下一个证据元素(如%2
)的应用程序结果。这段代码迭代地将一个双参数函数应用于序列中的连续元素(以相反的顺序进行)——显然是reduce
的例子
但是,这些结果被累积在历史
向量中,该向量返回到递归的上层<代码>减少累积结果为减少
。所以我相信代码的结构大致如下:
(reductions #(forward %1 %2 model) (:initial model) (reverse evidence))
递归首先下到
证据的末尾
并生成(:初始模型)
。这是减少的初始值
然后,递归的每个返回级别将#(正向%1%2模型)
应用于较低递归级别(如%1
,由peek
)和下一个证据元素(如%2
)的应用程序结果。这段代码迭代地将一个双参数函数应用于序列中的连续元素(以相反的顺序进行)——显然是reduce
的例子
但是,这些结果被累积在历史
向量中,该向量返回到递归的上层<代码>减少累积结果为减少
。所以我相信代码的结构大致如下:
(reductions #(forward %1 %2 model) (:initial model) (reverse evidence))
将%1替换为(向量%1)并成功!谢谢。快速提问:#()宏,是否等同于匿名(fn[ab])?仍然在寻找Clojure的方法,我以前从未见过它。@user1571406是的,它是匿名函数literal的读取器宏:将%1替换为(向量%1),它成功了!谢谢。快速提问:#()宏,是否等同于匿名(fn[ab])?仍然在寻找Clojure的方法,我以前从未见过它。@user1571406是的,它是匿名函数literal的读取器宏: