我对Prolog非常陌生,尤其是SWI-PL。我已经看到了有关计算矩阵向量乘积的几个相关问题。似乎它们都不必要地复杂或使用了库。 question包含点积的一个很好的基本原理实现,例如:
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]
我想念什么?
答案 0 :(得分:3)
maplist
同时迭代这三个列表。因此,这意味着通话:
maplist(dot, M, V, R)
这意味着dot(Mi, Vi, Ri)
(这是“伪代码”)将适用于所有i
。但这与类型不匹配:dot
期望这三个参数是 lists ,现在向量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].