(self, a, b, tags)
| 776 | # cond(x, p) for p in (None, 2, -2) |
| 777 | |
| 778 | def do(self, a, b, tags): |
| 779 | c = asarray(a) # a might be a matrix |
| 780 | if 'size-0' in tags: |
| 781 | assert_raises(LinAlgError, linalg.cond, c) |
| 782 | return |
| 783 | |
| 784 | # +-2 norms |
| 785 | s = linalg.svd(c, compute_uv=False) |
| 786 | assert_almost_equal( |
| 787 | linalg.cond(a), s[..., 0] / s[..., -1], |
| 788 | single_decimal=5, double_decimal=11) |
| 789 | assert_almost_equal( |
| 790 | linalg.cond(a, 2), s[..., 0] / s[..., -1], |
| 791 | single_decimal=5, double_decimal=11) |
| 792 | assert_almost_equal( |
| 793 | linalg.cond(a, -2), s[..., -1] / s[..., 0], |
| 794 | single_decimal=5, double_decimal=11) |
| 795 | |
| 796 | # Other norms |
| 797 | cinv = np.linalg.inv(c) |
| 798 | assert_almost_equal( |
| 799 | linalg.cond(a, 1), |
| 800 | abs(c).sum(-2).max(-1) * abs(cinv).sum(-2).max(-1), |
| 801 | single_decimal=5, double_decimal=11) |
| 802 | assert_almost_equal( |
| 803 | linalg.cond(a, -1), |
| 804 | abs(c).sum(-2).min(-1) * abs(cinv).sum(-2).min(-1), |
| 805 | single_decimal=5, double_decimal=11) |
| 806 | assert_almost_equal( |
| 807 | linalg.cond(a, np.inf), |
| 808 | abs(c).sum(-1).max(-1) * abs(cinv).sum(-1).max(-1), |
| 809 | single_decimal=5, double_decimal=11) |
| 810 | assert_almost_equal( |
| 811 | linalg.cond(a, -np.inf), |
| 812 | abs(c).sum(-1).min(-1) * abs(cinv).sum(-1).min(-1), |
| 813 | single_decimal=5, double_decimal=11) |
| 814 | assert_almost_equal( |
| 815 | linalg.cond(a, 'fro'), |
| 816 | np.sqrt((abs(c)**2).sum(-1).sum(-1) |
| 817 | * (abs(cinv)**2).sum(-1).sum(-1)), |
| 818 | single_decimal=5, double_decimal=11) |
| 819 | |
| 820 | |
| 821 | class TestCond(CondCases): |
nothing calls this directly
no test coverage detected