首页 > 解决方案 > 在 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]

我错过了什么?

标签: prolog

解决方案


maplist同时迭代三个列表。所以这意味着对于一个电话:

maplist(dot, M, V, R)

这意味着(这是“伪代码”)将适用于所有. 但这与类型不匹配:期望三个参数是列表,现在向量的元素是数字,而不是子列表。如果将矩阵与向量相乘,则结果的-th 值为:。由于点积是可交换的,我们可以交换操作数,所以也成立。dot(Mi, Vi, Ri)idotViMViRdot(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]. 

推荐阅读