prolog - 在 Prolog 中简单地计算矩阵向量积
问题描述
我对 prolog 很陌生,特别是 SWI-PL。我已经看到了几个有关计算矩阵向量产品的相关问题。似乎它们都不必要地复杂或使用库。这个问题包含点积的一个很好的第一原则实现:
dot([], [], 0).
dot([H1|T1], [H2|T2], Result) :-
Prod is H1 * H2,
dot(T1, T2, Remaining),
Result is Prod + Remaining.
似乎我们可以通过应用dot
到矩阵的每个元素和列表的每个元素来获得一个很好的矩阵向量积 (MVP) 定义。就像是:
maplist(dot, M, V, R).
或者
maplist(maplist(dot), M, V, R).
其中 M 是矩阵(列表列表),v 是向量,R 是结果。但是,对于以下值,这些始终给出false
,:
[[2,3],[4,5]],[1,0]
我错过了什么?
解决方案
maplist
同时迭代三个列表。所以这意味着对于一个电话:
maplist(dot, M, V, R)
这意味着(这是“伪代码”)将适用于所有. 但这与类型不匹配:期望三个参数是列表,现在向量的元素是数字,而不是子列表。如果将矩阵与向量相乘,则结果的-th 值为:。由于点积是可交换的,我们可以交换操作数,所以也成立。dot(Mi, Vi, Ri)
i
dot
Vi
M
V
i
R
dot(Mi, V, Ri)
dot(V, Mi, Ri)
这意味着我们可以将矩阵向量乘积定义为:
matvecprod(M, V, R) :-
maplist(dot(V), M, R).
例如:
?- matvecprod([[1,-1,2], [0,-3,1]], [2,1,0], R).
R = [1, -3].
推荐阅读
- ansible - 如何使用模式来指定多个清单组(不是主机)来运行剧本?
- java - Android - 融合位置:如何获得强制新位置
- javascript - 如何为已拖动的图像再次获取事件属性
- android - RecyclerView Android中多视图项目类型的ClickListener
- node.js - nodejs 为什么我不能使用 puppeteer-core?
- authentication - Xamarin.Auth:Account.Create() 不安全
- vue.js - 从 Vue 模板中读取所有元素绑定
- r - 我想在回归中使用固定效应模型,其中一个变量是组变量
- c# - 更新联接查询不更新表中的记录
- python - 删除格式不正确 Python 的 JSON 对象