equal
deleted
inserted
replaced
298 lemma box_vec_eq_empty [simp]: |
298 lemma box_vec_eq_empty [simp]: |
299 shows "cbox (vec a) (vec b) = {} \<longleftrightarrow> cbox a b = {}" |
299 shows "cbox (vec a) (vec b) = {} \<longleftrightarrow> cbox a b = {}" |
300 "box (vec a) (vec b) = {} \<longleftrightarrow> box a b = {}" |
300 "box (vec a) (vec b) = {} \<longleftrightarrow> box a b = {}" |
301 by (auto simp: Basis_vec_def mem_box box_eq_empty inner_axis) |
301 by (auto simp: Basis_vec_def mem_box box_eq_empty inner_axis) |
302 |
302 |
303 lemma norm_eq_0_imp: "norm x = 0 ==> x = (0::real ^'n)" by (metis norm_eq_zero) |
|
304 |
|
305 lemma norm_axis_1 [simp]: "norm (axis m (1::real)) = 1" |
303 lemma norm_axis_1 [simp]: "norm (axis m (1::real)) = 1" |
306 by (simp add: inner_axis' norm_eq_1) |
304 by (simp add: inner_axis' norm_eq_1) |
307 |
305 |
308 lemma vector_mul_eq_0[simp]: "(a *s x = 0) \<longleftrightarrow> a = (0::'a::idom) \<or> x = 0" |
306 lemma vector_mul_eq_0[simp]: "(a *s x = 0) \<longleftrightarrow> a = (0::'a::idom) \<or> x = 0" |
309 by vector |
307 by vector |
311 lemma vector_mul_lcancel[simp]: "a *s x = a *s y \<longleftrightarrow> a = (0::real) \<or> x = y" |
309 lemma vector_mul_lcancel[simp]: "a *s x = a *s y \<longleftrightarrow> a = (0::real) \<or> x = y" |
312 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib) |
310 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib) |
313 |
311 |
314 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::real) = b \<or> x = 0" |
312 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::real) = b \<or> x = 0" |
315 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib) |
313 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib) |
316 |
|
317 lemma vector_mul_lcancel_imp: "a \<noteq> (0::real) ==> a *s x = a *s y ==> (x = y)" |
|
318 by (metis vector_mul_lcancel) |
|
319 |
|
320 lemma vector_mul_rcancel_imp: "x \<noteq> 0 \<Longrightarrow> (a::real) *s x = b *s x ==> a = b" |
|
321 by (metis vector_mul_rcancel) |
|
322 |
314 |
323 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x" |
315 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x" |
324 apply (simp add: norm_vec_def) |
316 apply (simp add: norm_vec_def) |
325 apply (rule member_le_L2_set, simp_all) |
317 apply (rule member_le_L2_set, simp_all) |
326 done |
318 done |
602 apply (erule_tac x="i" in allE) |
594 apply (erule_tac x="i" in allE) |
603 apply (auto simp add: if_distrib cond_application_beta axis_def |
595 apply (auto simp add: if_distrib cond_application_beta axis_def |
604 sum.delta[OF finite] cong del: if_weak_cong) |
596 sum.delta[OF finite] cong del: if_weak_cong) |
605 done |
597 done |
606 |
598 |
607 lemma matrix_vector_mul_component: "((A::real^_^_) *v x)$k = (A$k) \<bullet> x" |
599 lemma matrix_vector_mul_component: "(A *v x)$k = (A$k) \<bullet> x" |
608 by (simp add: matrix_vector_mult_def inner_vec_def) |
600 by (simp add: matrix_vector_mult_def inner_vec_def) |
609 |
601 |
610 lemma dot_lmul_matrix: "((x::real ^_) v* A) \<bullet> y = x \<bullet> (A *v y)" |
602 lemma dot_lmul_matrix: "((x::real ^_) v* A) \<bullet> y = x \<bullet> (A *v y)" |
611 apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps) |
603 apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps) |
612 apply (subst sum.swap) |
604 apply (subst sum.swap) |
641 |
633 |
642 lemma transpose_iff [iff]: "transpose A = transpose B \<longleftrightarrow> A = B" |
634 lemma transpose_iff [iff]: "transpose A = transpose B \<longleftrightarrow> A = B" |
643 by (metis transpose_transpose) |
635 by (metis transpose_transpose) |
644 |
636 |
645 lemma matrix_mult_transpose_dot_column: |
637 lemma matrix_mult_transpose_dot_column: |
646 fixes A :: "real^'n^'n" |
|
647 shows "transpose A ** A = (\<chi> i j. (column i A) \<bullet> (column j A))" |
638 shows "transpose A ** A = (\<chi> i j. (column i A) \<bullet> (column j A))" |
648 by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def column_def inner_vec_def) |
639 by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def column_def inner_vec_def) |
649 |
640 |
650 lemma matrix_mult_transpose_dot_row: |
641 lemma matrix_mult_transpose_dot_row: |
651 fixes A :: "real^'n^'n" |
|
652 shows "A ** transpose A = (\<chi> i j. (row i A) \<bullet> (row j A))" |
642 shows "A ** transpose A = (\<chi> i j. (row i A) \<bullet> (row j A))" |
653 by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def row_def inner_vec_def) |
643 by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def row_def inner_vec_def) |
654 |
644 |
655 text\<open>Two sometimes fruitful ways of looking at matrix-vector multiplication.\<close> |
645 text\<open>Two sometimes fruitful ways of looking at matrix-vector multiplication.\<close> |
656 |
646 |
702 by (simp add: mat_def matrix_def axis_def) |
692 by (simp add: mat_def matrix_def axis_def) |
703 |
693 |
704 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r" |
694 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r" |
705 by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong) |
695 by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong) |
706 |
696 |
707 lemma matrix_vector_mul_linear: "linear(\<lambda>x. A *v (x::real ^ _))" |
697 lemma matrix_vector_mul_linear: "linear(\<lambda>x. A *v (x::('a::real_algebra_1) ^ _))" |
708 by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff |
698 by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff field_simps sum.distrib scaleR_right.sum) |
709 field_simps sum_distrib_left sum.distrib) |
|
710 |
699 |
711 lemma |
700 lemma |
712 fixes A :: "real^'n^'m" |
701 fixes A :: "'a::{euclidean_space,real_algebra_1}^'n^'m" |
713 shows matrix_vector_mult_linear_continuous_at [continuous_intros]: "isCont (( *v) A) z" |
702 shows matrix_vector_mult_linear_continuous_at [continuous_intros]: "isCont (( *v) A) z" |
714 and matrix_vector_mult_linear_continuous_on [continuous_intros]: "continuous_on S (( *v) A)" |
703 and matrix_vector_mult_linear_continuous_on [continuous_intros]: "continuous_on S (( *v) A)" |
715 by (simp_all add: linear_linear linear_continuous_at linear_continuous_on matrix_vector_mul_linear) |
704 by (simp_all add: linear_linear linear_continuous_at linear_continuous_on matrix_vector_mul_linear) |
716 |
705 |
717 lemma vector_matrix_left_distrib [algebra_simps]: |
706 lemma vector_matrix_left_distrib [algebra_simps]: |
793 assumes "invertible A" |
782 assumes "invertible A" |
794 shows "inj (( *v) A)" |
783 shows "inj (( *v) A)" |
795 by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid) |
784 by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid) |
796 |
785 |
797 lemma scalar_invertible: |
786 lemma scalar_invertible: |
798 fixes A :: "real^'m^'n" |
787 fixes A :: "('a::real_algebra_1)^'m^'n" |
799 assumes "k \<noteq> 0" and "invertible A" |
788 assumes "k \<noteq> 0" and "invertible A" |
800 shows "invertible (k *\<^sub>R A)" |
789 shows "invertible (k *\<^sub>R A)" |
801 proof - |
790 proof - |
802 obtain A' where "A ** A' = mat 1" and "A' ** A = mat 1" |
791 obtain A' where "A ** A' = mat 1" and "A' ** A = mat 1" |
803 using assms unfolding invertible_def by auto |
792 using assms unfolding invertible_def by auto |
807 thus "invertible (k *\<^sub>R A)" |
796 thus "invertible (k *\<^sub>R A)" |
808 unfolding invertible_def by auto |
797 unfolding invertible_def by auto |
809 qed |
798 qed |
810 |
799 |
811 lemma scalar_invertible_iff: |
800 lemma scalar_invertible_iff: |
812 fixes A :: "real^'m^'n" |
801 fixes A :: "('a::real_algebra_1)^'m^'n" |
813 assumes "k \<noteq> 0" and "invertible A" |
802 assumes "k \<noteq> 0" and "invertible A" |
814 shows "invertible (k *\<^sub>R A) \<longleftrightarrow> k \<noteq> 0 \<and> invertible A" |
803 shows "invertible (k *\<^sub>R A) \<longleftrightarrow> k \<noteq> 0 \<and> invertible A" |
815 by (simp add: assms scalar_invertible) |
804 by (simp add: assms scalar_invertible) |
816 |
805 |
817 lemma vector_transpose_matrix [simp]: "x v* transpose A = A *v x" |
806 lemma vector_transpose_matrix [simp]: "x v* transpose A = A *v x" |