Skip to content
This repository has been archived by the owner on Jul 24, 2024. It is now read-only.

[Merged by Bors] - feat(data/matrix/hadamard): add the Hadamard product #8956

Closed
wants to merge 37 commits into from
Closed
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
a2fb30d
add Hadamard product
l534zhan Sep 1, 2021
3480444
change
l534zhan Sep 1, 2021
1cf3219
change
l534zhan Sep 1, 2021
2906ebf
change
l534zhan Sep 1, 2021
359c23e
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
bf78597
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
42b8167
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
17f7e30
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
b306926
change
l534zhan Sep 2, 2021
22d5f50
change
l534zhan Sep 2, 2021
7d5ee79
change
l534zhan Sep 2, 2021
1674757
change
l534zhan Sep 2, 2021
ed62498
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
1188d75
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
f9892ad
change
l534zhan Sep 2, 2021
2414673
change
l534zhan Sep 2, 2021
a492744
change
l534zhan Sep 2, 2021
1e35287
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
9bc2a8b
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
549de10
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
bf9149e
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
c08e3eb
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
8aab42e
change
l534zhan Sep 2, 2021
9c21a73
change
l534zhan Sep 2, 2021
6f87986
change
l534zhan Sep 2, 2021
cae9ded
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
6184dc5
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
9c28a95
change
l534zhan Sep 2, 2021
162cedb
change
l534zhan Sep 2, 2021
1de3198
change
l534zhan Sep 2, 2021
36873a1
change
l534zhan Sep 2, 2021
cdc803f
Update src/data/matrix/hadamard.lean
l534zhan Sep 2, 2021
35c3baf
change
l534zhan Sep 2, 2021
fe90dcc
Merge branch 'master' of github.com:leanprover-community/mathlib into…
l534zhan Sep 4, 2021
fe1bfc9
change
l534zhan Sep 4, 2021
bbf90cd
change
l534zhan Sep 4, 2021
d0c099f
change
l534zhan Sep 6, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/data/matrix/basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,13 @@ variables {n α R}
(diagonal d).map f = diagonal (λ m, f (d m)) :=
by { ext, simp only [diagonal, map_apply], split_ifs; simp [h], }

@[simp] lemma diagonal_conj_transpose [semiring α] [star_ring α] (v : n → α) :
(diagonal v)ᴴ = diagonal (star v) :=
begin
rw [conj_transpose, diagonal_transpose, diagonal_map (star_zero _)],
refl,
end

section one
variables [has_zero α] [has_one α]

Expand Down
142 changes: 142 additions & 0 deletions src/data/matrix/hadamard.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
/-
Copyright (c) 2021 Lu-Ming Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Lu-Ming Zhang
-/
import data.matrix.notation
import linear_algebra.matrix.trace
import data.complex.basic
l534zhan marked this conversation as resolved.
Show resolved Hide resolved

/-!
# Hadamard product of matrices

This file defines the Hadamard product `matrix.hadamard`
and contains basic properties about them.

## Main definition

- `matrix.hadamard`: defines the Hadamard product,
which is the pointwise product of two matrices of the same size.

## Notation

* `⊙`: the Hadamard product `matrix.hadamard`;

## References

* <https://en.wikipedia.org/wiki/hadamard_product_(matrices)>

## Tags

hadamard product, hadamard
-/

variables {α β γ m n : Type*}
variables {R : Type*}

namespace matrix
open_locale matrix big_operators
open complex

/-- `matrix.hadamard` defines the Hadamard product,
which is the pointwise product of two matrices of the same size.-/
@[simp]
def hadamard [has_mul α] (A : matrix m n α) (B : matrix m n α) : matrix m n α
| i j := A i j * B i j

localized "infix ` ⊙ `:100 := matrix.hadamard" in matrix

section basic_properties

variables (A : matrix m n α) (B : matrix m n α) (C : matrix m n α)

/- commutativity -/
lemma hadamard_comm [comm_semigroup α] : A ⊙ B = B ⊙ A :=
ext $ λ _ _, mul_comm _ _
l534zhan marked this conversation as resolved.
Show resolved Hide resolved

/- associativity -/
lemma hadamard_assoc [semigroup α] : A ⊙ B ⊙ C = A ⊙ (B ⊙ C) :=
ext $ λ _ _, mul_assoc _ _ _

/- distributivity -/
lemma hadamard_add [distrib α] : A ⊙ (B + C) = A ⊙ B + A ⊙ C :=
ext $ λ _ _, left_distrib _ _ _

lemma add_hadamard [distrib α] : (B + C) ⊙ A = B ⊙ A + C ⊙ A :=
ext $ λ _ _, right_distrib _ _ _

/- scalar multiplication -/
section scalar

@[simp] lemma smul_hadamard [has_mul α] [has_scalar R α] [is_scalar_tower R α α] (k : R) :
(k • A) ⊙ B = k • A ⊙ B :=
ext $ λ _ _, smul_assoc _ (A _ _) _
l534zhan marked this conversation as resolved.
Show resolved Hide resolved

@[simp] lemma hadamard_smul [has_mul α] [has_scalar R α] [smul_comm_class R α α] (k : R):
A ⊙ (k • B) = k • A ⊙ B :=
ext $ λ _ _, (smul_comm _ (A _ _) _).symm
l534zhan marked this conversation as resolved.
Show resolved Hide resolved

end scalar

section zero

variables [mul_zero_class α]

@[simp] lemma hadamard_zero : A ⊙ (0 : matrix m n α) = 0 :=
ext $ λ _ _, mul_zero _

@[simp] lemma zero_hadamard : (0 : matrix m n α) ⊙ A = 0 :=
ext $ λ _ _, zero_mul _

end zero

section one

variables [decidable_eq n] [mul_zero_one_class α]
variables (M : matrix n n α)

lemma hadamard_one : M ⊙ (1 : matrix n n α) = diagonal (λ i, M i i) :=
by { ext, by_cases h : i = j; simp [h] }

lemma one_hadamard : (1 : matrix n n α) ⊙ M = diagonal (λ i, M i i) :=
by { ext, by_cases h : i = j; simp [h] }

end one

section diagonal

variables [decidable_eq n] [mul_zero_class α]

lemma diagonal_hadamard_diagonal (v : n → α) (w : n → α) :
diagonal v ⊙ diagonal w = diagonal (v * w) :=
ext $ λ _ _, (apply_ite2 _ _ _ _ _ _).trans (congr_arg _ $ zero_mul 0)

end diagonal

section trace

variables [fintype m] [fintype n]
variables (R) [semiring α] [semiring R] [module R α]

lemma sum_hadamard_eq : ∑ (i : m) (j : n), (A ⊙ B) i j = trace m R α (A ⬝ Bᵀ) :=
rfl

lemma dot_product_vec_mul_hadamard [decidable_eq m] [decidable_eq n] (v : m → α) (w : n → α) :
dot_product (vec_mul v (A ⊙ B)) w = trace m R α (diagonal v ⬝ A ⬝ (B ⬝ diagonal w)ᵀ) :=
begin
rw [←sum_hadamard_eq, finset.sum_comm],
simp [dot_product, vec_mul, finset.sum_mul, mul_assoc],
end

/-- the `star` version of `dot_product_vec_mul_hadamard` -/
lemma dot_product_vec_mul_star_hadamard [star_ring α] [decidable_eq m] [decidable_eq n]
Vierkantor marked this conversation as resolved.
Show resolved Hide resolved
(A : matrix m n α) (B : matrix m n α) (v : m → α) (w : n → α) :
dot_product (vec_mul (star v) (A ⊙ B)) w =
trace m R α ((diagonal v)ᴴ ⬝ A ⬝ (B ⬝ (diagonal w))ᵀ) :=
by rw [diagonal_conj_transpose, dot_product_vec_mul_hadamard R]

end trace

end basic_properties

end matrix