简单地在Prolog中计算矩阵矢量积

时间:2018-10-22 07:48:07

标签: prolog

我对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]

我想念什么?

1 个答案:

答案 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].