我需要找到矩阵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。
我被困住了,不知道接下来该做什么。
答案 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 所以我们可以节省一半的工作。此外,如果矩阵中的元素缺失,那么我们就无法计算产品。我将此作为练习。