zoukankan      html  css  js  c++  java
  • 【Python】Coding the Matrix:Week 5: Dimension Homework 5

    这一周的作业,刚压线写完。Problem3 没有写,不想证明了。从Problem 9 开始一直到最后难度都挺大的,我是在论坛上看过了别人的讨论才写出来的,挣扎了很久。

    Problem 9在给定的基上分解向量,里面调用了hw4的一些函数,通过solve函数获得矩阵方程的解

    Problem 10判断矩阵是不是可逆的,注意判断矩阵是不是square的

    Problem 11和Problem 12 都是求逆,也是解方程,只是函数的参数需要参考一下源码

    发现一个有趣的事情,Coding the Matrix的论坛上有个老头胡子都白了也在学这个课程,好励志的感觉,不过人家貌似是教授来着。

    # version code 941
    # Please fill out this stencil and submit using the provided submission script.
    
    from vecutil import list2vec
    from solver import solve
    from matutil import *
    from mat import Mat
    from GF2 import one
    from vec import Vec
    from independence import *
    from triangular import *
    from hw4 import *
    
    ## Problem 1
    w0 = list2vec([1,0,0])
    w1 = list2vec([0,1,0])
    w2 = list2vec([0,0,1])
    
    v0 = list2vec([1,2,3])
    v1 = list2vec([1,3,3])
    v2 = list2vec([0,3,3])
    
    # Fill in exchange_S1 and exchange_S2
    # with appropriate lists of 3 vectors
    
    exchange_S0 = [w0,w1,w2]
    exchange_S1 = [v0,w1,w2]
    exchange_S2 = [v0,v1,w2]
    exchange_S3 = [v0,v1,v2]
    
    
    
    ## Problem 2
    w0 = list2vec([0,one,0])
    w1 = list2vec([0,0,one])
    w2 = list2vec([one,one,one])
    
    v0 = list2vec([one,0,one])
    v1 = list2vec([one,0,0])
    v2 = list2vec([one,one,0])
    
    exchange_2_S0 = [w0, w1, w2]
    exchange_2_S1 = [w0,w1,v1]
    exchange_2_S2 = [w0,v0,v1]
    exchange_2_S3 = [v0, v1, v2]
    
    
    
    ## Problem 3
    def morph(S, B):
        '''
        Input:
            - S: a list of distinct Vec instances
            - B: a list of linearly independent Vec instances
            - Span S == Span B
        Output: a list of pairs of vectors to inject and eject
        Example:
            >>> #This is how our morph works.  Yours may yield different results.
            >>> S = [list2vec(v) for v in [[1,0,0],[0,1,0],[0,0,1]]]
            >>> B = [list2vec(v) for v in [[1,1,0],[0,1,1],[1,0,1]]]
            >>> morph(S, B)
            [(Vec({0, 1, 2},{0: 1, 1: 1, 2: 0}), Vec({0, 1, 2},{0: 1, 1: 0, 2: 0})), (Vec({0, 1, 2},{0: 0, 1: 1, 2: 1}), Vec({0, 1, 2},{0: 0, 1: 1, 2: 0})), (Vec({0, 1, 2},{0: 1, 1: 0, 2: 1}), Vec({0, 1, 2},{0: 0, 1: 0, 2: 1}))]
    
        '''
        pass
    
    
    
    ## Problem 4
    # Please express each solution as a list of vectors (Vec instances)
    
    row_space_1 = [list2vec([1,2,0]),list2vec([0,2,1])]
    col_space_1 = [list2vec([1,0]),list2vec([0,1])]
    
    row_space_2 = [list2vec([1,4,0,0]),list2vec([0,2,2,0]),list2vec([0,0,1,1])]
    col_space_2 = [list2vec([1,0,0]),list2vec([4,2,0]),list2vec([0,0,1])]
    
    row_space_3 = [list2vec([1])]
    col_space_3 = [list2vec([1,2,3])]
    
    row_space_4 = [list2vec([1,0]),list2vec([2,1])]
    col_space_4 = [list2vec([1,2,3]),list2vec([0,1,4])]
    
    
    
    ## Problem 5
    def my_is_independent(L): 
        '''
        input:  A list, L, of Vecs
        output: A boolean indicating if the list is linearly independent
        
        >>> L = [Vec({0, 1, 2},{0: 1, 1: 0, 2: 0}), Vec({0, 1, 2},{0: 0, 1: 1, 2: 0}), Vec({0, 1, 2},{0: 0, 1: 0, 2: 1}), Vec({0, 1, 2},{0: 1, 1: 1, 2: 1}), Vec({0, 1, 2},{0: 1, 1: 1, 2: 0}), Vec({0, 1, 2},{0: 0, 1: 1, 2: 1})]
        >>> my_is_independent(L)
        False
        >>> my_is_independent(L[:2])
        True
        >>> my_is_independent(L[:3])
        True
        >>> my_is_independent(L[1:4])
        True
        >>> my_is_independent(L[0:4])
        False
        >>> my_is_independent(L[2:])
        False
        >>> my_is_independent(L[2:5])
        False
        '''
        if rank(L)==len(L):return True
        else:return False
    
    
    ## Problem 6
    def subset_basis(T): 
        '''
        input: A list, T, of Vecs
        output: A list, S, containing Vecs from T, that is a basis for the
        space spanned by T.
        
        >>> a0 = Vec({'a','b','c','d'}, {'a':1})
        >>> a1 = Vec({'a','b','c','d'}, {'b':1})
        >>> a2 = Vec({'a','b','c','d'}, {'c':1})
        >>> a3 = Vec({'a','b','c','d'}, {'a':1,'c':3})
        >>> subset_basis([a0,a1,a2,a3]) == [Vec({'c', 'b', 'a', 'd'},{'a': 1}), Vec({'c', 'b', 'a', 'd'},{'b': 1}), Vec({'c', 'b', 'a', 'd'},{'c': 1})]
        True
        '''
        r=[]
        for x in T:
            r.append(x)
            #print(x)
            if my_is_independent(r)==False:r.remove(x)   
        #print(r)
        return r     
    
    
    
    ## Problem 7
    def my_rank(L): 
        '''
        input: A list, L, of Vecs
        output: The rank of the list of Vecs
        
        >>> my_rank([list2vec(v) for v in [[1,2,3],[4,5,6],[1.1,1.1,1.1]]])
        2
        '''
        return len(subset_basis(L))
    
    
    ## Problem 8
    # Please give each answer as a boolean
    
    only_share_the_zero_vector_1 = True
    only_share_the_zero_vector_2 = True
    only_share_the_zero_vector_3 = True
    
    
    
    ## Problem 9
    def direct_sum_decompose(U_basis, V_basis, w):
        '''
        input:  A list of Vecs, U_basis, containing a basis for a vector space, U.
        A list of Vecs, V_basis, containing a basis for a vector space, V.
        A Vec, w, that belongs to the direct sum of these spaces.
        output: A pair, (u, v), such that u+v=w and u is an element of U and
        v is an element of V.
        
        >>> U_basis = [Vec({0, 1, 2, 3, 4, 5},{0: 2, 1: 1, 2: 0, 3: 0, 4: 6, 5: 0}), Vec({0, 1, 2, 3, 4, 5},{0: 11, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0}), Vec({0, 1, 2, 3, 4, 5},{0: 3, 1: 1.5, 2: 0, 3: 0, 4: 7.5, 5: 0})]
        >>> V_basis = [Vec({0, 1, 2, 3, 4, 5},{0: 0, 1: 0, 2: 7, 3: 0, 4: 0, 5: 1}), Vec({0, 1, 2, 3, 4, 5},{0: 0, 1: 0, 2: 15, 3: 0, 4: 0, 5: 2})]
        >>> w = Vec({0, 1, 2, 3, 4, 5},{0: 2, 1: 5, 2: 0, 3: 0, 4: 1, 5: 0})
        >>> direct_sum_decompose(U_basis, V_basis, w) == (Vec({0, 1, 2, 3, 4, 5},{0: 2.0, 1: 4.999999999999972, 2: 0.0, 3: 0.0, 4: 1.0, 5: 0.0}), Vec({0, 1, 2, 3, 4, 5},{0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}))
        True
        '''
        T=U_basis + V_basis
        x=vec2rep(T,w)
        #print(T,w,x)
        rep=list(x.f.values())
        u1=list2vec(rep[0:len(U_basis)])
        v1=list2vec(rep[len(U_basis):len(T)])
        u=rep2vec(u1,U_basis)
        v=rep2vec(v1,V_basis)
        return (u,v)
    
    
    
    ## Problem 10
    def is_invertible(M): 
        '''
        input: A matrix, M
        outpit: A boolean indicating if M is invertible.
        
        >>> M = Mat(({0, 1, 2, 3}, {0, 1, 2, 3}), {(0, 1): 0, (1, 2): 1, (3, 2): 0, (0, 0): 1, (3, 3): 4, (3, 0): 0, (3, 1): 0, (1, 1): 2, (2, 1): 0, (0, 2): 1, (2, 0): 0, (1, 3): 0, (2, 3): 1, (2, 2): 3, (1, 0): 0, (0, 3): 0})
        >>> is_invertible(M)
        True
        '''
        L=mat2coldict(M)
        L=list(L.values())
        if len(L)!=len(L[0].D):return False
        else:return rank(L)==len(L)
    
    ## Problem 11
    def find_matrix_inverse(A):
        '''
        input: An invertible matrix, A, over GF(2)
        output: Inverse of A
    
        >>> M = Mat(({0, 1, 2}, {0, 1, 2}), {(0, 1): one, (1, 2): 0, (0, 0): 0, (2, 0): 0, (1, 0): one, (2, 2): one, (0, 2): 0, (2, 1): 0, (1, 1): 0})
        >>> find_matrix_inverse(M) == Mat(({0, 1, 2}, {0, 1, 2}), {(0, 1): one, (2, 0): 0, (0, 0): 0, (2, 2): one, (1, 0): one, (1, 2): 0, (1, 1): 0, (2, 1): 0, (0, 2): 0})
        True
        '''
        B=[]
        for i in range(len(A.D[0])):
            b=Vec(A.D[0],{})
            b[i]=one
            t=solve(A,b)
            B.append(t)
        B=coldict2mat(B)   
        return B
    
    
    
    ## Problem 12
    def find_triangular_matrix_inverse(A): 
        '''
        input: An upper triangular Mat, A, with nonzero diagonal elements
        output: Inverse of A
        >>> A = listlist2mat([[1, .5, .2, 4],[0, 1, .3, .9],[0,0,1,.1],[0,0,0,1]])
        >>> find_triangular_matrix_inverse(A) == Mat(({0, 1, 2, 3}, {0, 1, 2, 3}), {(0, 1): -0.5, (1, 2): -0.3, (3, 2): 0.0, (0, 0): 1.0, (3, 3): 1.0, (3, 0): 0.0, (3, 1): 0.0, (2, 1): 0.0, (0, 2): -0.05000000000000002, (2, 0): 0.0, (1, 3): -0.87, (2, 3): -0.1, (2, 2): 1.0, (1, 0): 0.0, (0, 3): -3.545, (1, 1): 1.0})
        True
        '''
        B=[]
        C=mat2rowdict(A)
        for i in range(len(A.D[0])):
            b=Vec(A.D[0],{})
            b[i]=1
            t=triangular_solve(C,range(len(C)),b)
            B.append(t)
        B=coldict2mat(B)
        return B
    


  • 相关阅读:
    Serverless 的初心、现状和未来
    父亲的茶杯
    子慕谈设计模式系列(三)
    子慕谈设计模式系列(二)——设计模式六大原则
    子慕谈设计模式系列(一)
    初入angular4——实际项目搭建总结
    欲练JS,必先攻CSS——前端修行之路
    运用google-protobuf的IM消息应用开发(前端篇)
    “倔驴”一个h5小游戏的实现和思考(码易直播)——总结与整理
    【猿分享第10期】微信小程序Meetup扫盲专场回顾(转载)
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3283468.html
Copyright © 2011-2022 走看看