Prolog - 矩阵与其转置的乘法

时间:2017-11-01 06:27:47

标签: matrix prolog transpose multiplication

我需要找到矩阵A的乘积及其转置A ^ t,所以我应该得到第三个矩阵B = A * A ^ t。 示例:A=[[1,2],[3,4]](然后是A^t=[[1,3],[2,4]])所以B=[[5,11],[11,25]] (每个子列表是矩阵的一行)

首先,我认为这应该更容易,因为A ^ t的列是A的行。所以对于A行的点积和A ^ t的列,我想我可以使用这个:

sum([M|Ms],[N|Ns],Sum) :-
    sum(Ms,Ns,S),
    Sum is S+M*N.
 sum([],[],0).

我也不能使用clpfd或if-else。

我被困住了,不知道接下来该做什么。

1 个答案:

答案 0 :(得分:0)

对于此,您可以使用矩阵A行的点积。虽然您可能更好地命名此函数dot_product/3而不是sum/3

剩下的唯一任务是为A中的每两行计算此点积。所以 B i,j -th元素是 A i A的点积<子>Ĵ

我们可以构造一个谓词来计算一行 B

transprod_row(A, AI, Row) :-
    maplist(dot_product(AI), A, Row).

此外,我们可以使用另一个transprod/3计算maplist/3

transprod(A, B) :-
    maplist(transprod_row(A),A,B).

或完整:

dot_product([],[],0).
dot_product([M|Ms],[N|Ns],Sum) :-
    dot_product(Ms,Ns,S),
    Sum is S+M*N.

transprod_row(A, AI, Row) :-
    maplist(dot_product(AI), A, Row).

transprod(A, B) :-
    maplist(transprod_row(A),A,B).

然后生成:

?- transprod([[1,2],[3,4]],B).
B = [[5, 11], [11, 25]].

代码不是最优雅,也不是非常有效,因为 B ij 等于 B ji 所以我们可以节省一半的工作。此外,如果矩阵中的元素缺失,那么我们就无法计算产品。我将此作为练习。