@@ -25,6 +25,8 @@ corresponding `*_eq` lemmas to be used in a place where they are definitionally
2525* `matrix.transposeᵣ`
2626* `matrix.dot_productᵣ`
2727* `matrix.mulᵣ`
28+ * `matrix.mul_vecᵣ`
29+ * `matrix.vec_mulᵣ`
2830* `matrix.eta_expand`
2931
3032 -/
@@ -130,17 +132,17 @@ example (a b c d : α) [has_mul α] [add_comm_monoid α] :
130132def mulᵣ [has_mul α] [has_add α] [has_zero α]
131133 (A : matrix (fin l) (fin m) α) (B : matrix (fin m) (fin n) α) :
132134 matrix (fin l) (fin n) α :=
133- of $ fin_vec.map (λ v₁, fin_vec.map (λ v₂, dot_productᵣ v₁ v₂) (transposeᵣ B) ) A
135+ of $ fin_vec.map (λ v₁, fin_vec.map (λ v₂, dot_productᵣ v₁ v₂) Bᵀ ) A
134136
135137/-- This can be used to prove
136138```lean
137- example [add_comm_monoid α] [has_mul α]
138- (a₁₁ a₁₂ a₁₃ a₂₁ a₂₂ a₂₃ a₃₁ a₃₂ a₃₃ b₁₁ b₁₂ b₁₃ b₂₁ b₂₂ b₂₃ b₃₁ b₃₂ b₃₃ : α) :
139+ example [add_comm_monoid α] [has_mul α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁₁ b₁₂ b₂₁ b₂₂ : α) :
139140 !![a₁₁, a₁₂;
140141 a₂₁, a₂₂] ⬝ !![b₁₁, b₁₂;
141142 b₂₁, b₂₂] =
142143 !![a₁₁*b₁₁ + a₁₂*b₂₁, a₁₁*b₁₂ + a₁₂*b₂₂;
143144 a₂₁*b₁₁ + a₂₂*b₂₁, a₂₁*b₁₂ + a₂₂*b₂₂] :=
145+ (mulᵣ_eq _ _).symm
144146```
145147-/
146148@[simp]
@@ -152,15 +154,68 @@ begin
152154 refl,
153155end
154156
155- example [add_comm_monoid α] [has_mul α]
156- (a₁₁ a₁₂ a₁₃ a₂₁ a₂₂ a₂₃ a₃₁ a₃₂ a₃₃ b₁₁ b₁₂ b₁₃ b₂₁ b₂₂ b₂₃ b₃₁ b₃₂ b₃₃ : α) :
157+ example [add_comm_monoid α] [has_mul α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁₁ b₁₂ b₂₁ b₂₂ : α) :
157158 !![a₁₁, a₁₂;
158159 a₂₁, a₂₂].mul !![b₁₁, b₁₂;
159160 b₂₁, b₂₂] =
160161 !![a₁₁*b₁₁ + a₁₂*b₂₁, a₁₁*b₁₂ + a₁₂*b₂₂;
161162 a₂₁*b₁₁ + a₂₂*b₂₁, a₂₁*b₁₂ + a₂₂*b₂₂] :=
162163(mulᵣ_eq _ _).symm
163164
165+ /-- `matrix.mul_vec` with better defeq for `fin` -/
166+ def mul_vecᵣ [has_mul α] [has_add α] [has_zero α] (A : matrix (fin l) (fin m) α) (v : fin m → α) :
167+ fin l → α :=
168+ fin_vec.map (λ a, dot_productᵣ a v) A
169+
170+ /-- This can be used to prove
171+ ```lean
172+ example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
173+ !![a₁₁, a₁₂;
174+ a₂₁, a₂₂].mul_vec ![b₁, b₂] = ![a₁₁*b₁ + a₁₂*b₂, a₂₁*b₁ + a₂₂*b₂] :=
175+ (mul_vecᵣ_eq _ _).symm
176+ ```
177+ -/
178+ @[simp]
179+ lemma mul_vecᵣ_eq [non_unital_non_assoc_semiring α]
180+ (A : matrix (fin l) (fin m) α) (v : fin m → α) :
181+ mul_vecᵣ A v = A.mul_vec v :=
182+ begin
183+ simp [mul_vecᵣ, function.comp],
184+ refl,
185+ end
186+
187+ example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
188+ !![a₁₁, a₁₂;
189+ a₂₁, a₂₂].mul_vec ![b₁, b₂] = ![a₁₁*b₁ + a₁₂*b₂, a₂₁*b₁ + a₂₂*b₂] :=
190+ (mul_vecᵣ_eq _ _).symm
191+
192+ /-- `matrix.vec_mul` with better defeq for `fin` -/
193+ def vec_mulᵣ [has_mul α] [has_add α] [has_zero α] (v : fin l → α) (A : matrix (fin l) (fin m) α):
194+ fin m → α :=
195+ fin_vec.map (λ a, dot_productᵣ v a) Aᵀ
196+
197+ /-- This can be used to prove
198+ ```lean
199+ example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
200+ vec_mul ![b₁, b₂] !![a₁₁, a₁₂;
201+ a₂₁, a₂₂] = ![b₁*a₁₁ + b₂*a₂₁, b₁*a₁₂ + b₂*a₂₂] :=
202+ (vec_mulᵣ_eq _ _).symm
203+ ```
204+ -/
205+ @[simp]
206+ lemma vec_mulᵣ_eq [non_unital_non_assoc_semiring α]
207+ (v : fin l → α) (A : matrix (fin l) (fin m) α) :
208+ vec_mulᵣ v A = vec_mul v A :=
209+ begin
210+ simp [vec_mulᵣ, function.comp],
211+ refl,
212+ end
213+
214+ example [non_unital_non_assoc_semiring α] (a₁₁ a₁₂ a₂₁ a₂₂ b₁ b₂ : α) :
215+ vec_mul ![b₁, b₂] !![a₁₁, a₁₂;
216+ a₂₁, a₂₂] = ![b₁*a₁₁ + b₂*a₂₁, b₁*a₁₂ + b₂*a₂₂] :=
217+ (vec_mulᵣ_eq _ _).symm
218+
164219/-- Expand `A` to `!![A 0 0, ...; ..., A m n]` -/
165220def eta_expand {m n} (A : matrix (fin m) (fin n) α) : matrix (fin m) (fin n) α :=
166221matrix.of (fin_vec.eta_expand (λ i, fin_vec.eta_expand (λ j, A i j)))
0 commit comments