From 591601df2ef73b192f3ed491f1f168fa71ed5302 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Sun, 9 Oct 2016 21:26:56 -0400 Subject: [PATCH] Add an inner_product() for matrices. --- src/dunshire/matrices.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/dunshire/matrices.py b/src/dunshire/matrices.py index 7bfc429..52ba2a3 100644 --- a/src/dunshire/matrices.py +++ b/src/dunshire/matrices.py @@ -83,6 +83,37 @@ def identity(domain_dim): return matrix(entries, (domain_dim, domain_dim)) +def inner_product(vec1, vec2): + """ + Compute the (Euclidean) inner product of the two vectors ``vec1`` + and ``vec2``. + + EXAMPLES: + + >>> x = [1,2,3] + >>> y = [3,4,1] + >>> inner_product(x,y) + 14 + + >>> x = matrix([1,1,1]) + >>> y = matrix([2,3,4], (1,3)) + >>> inner_product(x,y) + 9 + + >>> x = [1,2,3] + >>> y = [1,1] + >>> inner_product(x,y) + Traceback (most recent call last): + ... + TypeError: the lengths of vec1 and vec2 must match + + """ + if not len(vec1) == len(vec2): + raise TypeError('the lengths of vec1 and vec2 must match') + + return sum([x*y for (x,y) in zip(vec1,vec2)]) + + def norm(matrix_or_vector): """ Return the Frobenius norm of ``matrix_or_vector``, which is the same @@ -100,7 +131,7 @@ def norm(matrix_or_vector): 2.0 """ - return sqrt(sum([x**2 for x in matrix_or_vector])) + return sqrt(inner_product(matrix_or_vector,matrix_or_vector)) def vec(real_matrix): -- 2.44.2