def fit(self, epoch=10):
        A = self.Mat
        data = A.data
        X = self.X
        while epoch:
            m = absmax(X)
            X = [i / m for i in X]
            X = GaussEq(A, X)
            epoch -= 1

        AX = [sum([A_i[j] * X_j for j, X_j in enumerate(X)]) for A_i in data]
        m1 = sum(dot_vec(AX, X)) / sum(dot_vec(X, X))
        self.X = X
        return m1
 def fit(self, B):
     if isinstance(B, matrix):
         B = B.c(range(B.size[0]), 0)
     n = len(B)
     L = self.L
     U = self.U
     y = [0 for i in xrange(n)]
     x = [0 for i in xrange(n)]
     for i in xrange(n):
         rang = range(i)
         y[i] = B[i] - sum(dot_vec(L.c([i], rang), y[:i]))
     for i in xrange(n - 1, -1, -1):
         rang = range(i + 1, n)
         x[i] = (y[i] -
                 sum(dot_vec(U.c([i], rang), x[(i + 1):]))) / U.data[i][i]
     return x
def GaussEq(A, B):
    if isinstance(B, matrix):
        B = B.c(range(B.size[0]), 0)
    B = copy.deepcopy(B)
    size = A.size
    data = copy.deepcopy(A.data)
    row_arg = range(size[0])
    if size[0] != size[1]:
        print('error\n')
        return ValueError
    size = size[0]
    for i in row_arg[:-1]:
        vec = matrix(data).c(range(i, size), i)
        max_index = i + argabsmax(vec)
        data[max_index], data[i] = data[i], data[max_index]
        B[max_index], B[i] = B[i], B[max_index]
        for index in range(i + 1, size):
            try:
                param = data[index][i] / data[i][i]
                data[index] = add_vec(data[index], data[i], -param)
                B[index] += B[i] * (-param)
            except:
                print('error: a singular matrix')
                return ValueError
    row_arg.reverse()
    x = [0 for i in range(size)]
    for i in row_arg:
        x[i] = (B[i] - sum(dot_vec(x[i:], data[i][i:]))) / data[i][i]
    return x
    def fit(self, epoch=10):
        data = self.Mat.data
        X = self.X
        while epoch:

            m = absmax(X)
            X = [i / m for i in X]
            X = [
                sum([A_i[j] * X_j for j, X_j in enumerate(X)]) for A_i in data
            ]
            epoch -= 1
        #get rayleigh div
        AX = [sum([A_i[j] * X_j for j, X_j in enumerate(X)]) for A_i in data]
        m1 = sum(dot_vec(AX, X)) / sum(dot_vec(X, X))
        #m2=absmax(X)
        self.X = X
        return m1  #,m2
def LU(A):
    size = A.size
    if size[0] != size[1]:
        return ValueError
    L = matrix(size, eye=True)
    U = matrix(size, eye=False)
    size = size[0]
    aij = A.data
    for i in range(0, size):
        rang = range(0, i)
        for r in range(i, size):
            U.data[i][r] = aij[i][r] - sum(
                dot_vec(L.c([i], rang), U.c(rang, [r])))
        for r in range(i + 1, size):
            L.data[r][i] = (aij[r][i] - sum(
                dot_vec(L.c([r], rang), U.c(rang, [i])))) / U.data[i][i]

    return L.data, U.data
def Chol(A):
    size = A.size
    if size[0] != size[1]:
        return ValueError
    if not check_symmetrical(A):
        print 'Not symmetrical!\n'
        return ValueError
    aij = A.data
    L = matrix(size, eye=False)
    size = size[0]
    for j in range(size):
        try:
            L[j][j] = math.sqrt(aij[j][j] - sum(dot_vec(L[j][:j], L[j][:j])))
        except:
            print 'error:Not positive!\n'

        for i in range(j + 1, size):
            try:
                L[i][j] = (aij[i][j] -
                           sum(dot_vec(L[i][:j], L[j][:j]))) / L[j][j]
            except:
                print 'error:Not positive!\n'
    return L
def vecmean(vecs):
    summa = reduce(add_vec, vecs)
    n = len(vecs)
    ret = dot_vec(1 / n, summa)
    return ret