matrix Multiplication

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Sssasss

    #1

    matrix Multiplication

    hi evrybody!

    I wan't to multiply two square matrixes, and i don't understand why it
    doesn't work.
    Could you explain me?

    def multmat(A,B):
    "A*B"
    if len(A)!=len(B): return "error"
    D=[]
    C=[]
    for i in range(len(A)): D.append(0)
    for i in range(len(A)): C.append(D)
    for i in range(len(A)):
    for j in range(len(A)):
    for k in range(len(A)):
    C[i][j]+=A[i][k]*B[k][j]
    print C[i][j]
    print C[i]
    return C

    when i use it on :
    >>A=[[2,3,4],[5,8,6],[4,5,7]]
    >>B=[[1,0,0],[0,1,0],[0,0,1]]
    I get :
    2
    2
    2
    0
    3
    3
    0
    0
    4
    [2, 3, 4]
    7
    7
    7
    3
    11
    11
    4
    4
    10
    [7, 11, 10]
    11
    11
    11
    11
    16
    16
    10
    10
    17
    [11, 16, 17]
    [[11, 16, 17], [11, 16, 17], [11, 16, 17]]

    thank you

  • Fredrik Lundh

    #2
    Re: matrix Multiplication

    "Sssasss" wrote:
    I wan't to multiply two square matrixes, and i don't understand why it
    doesn't work.
    >
    def multmat(A,B):
    "A*B"
    if len(A)!=len(B): return "error"
    D=[]
    C=[]
    for i in range(len(A)): D.append(0)
    for i in range(len(A)): C.append(D)
    append doesn't copy data, so you're basically adding len(A) references to
    the same D list to C. for more on this, see:



    </F>



    Comment

    • Sssasss

      #3
      Re: matrix Multiplication


      Fredrik Lundh wrote:
      "Sssasss" wrote:
      >
      I wan't to multiply two square matrixes, and i don't understand why it
      doesn't work.

      def multmat(A,B):
      "A*B"
      if len(A)!=len(B): return "error"
      D=[]
      C=[]
      for i in range(len(A)): D.append(0)
      for i in range(len(A)): C.append(D)
      >
      append doesn't copy data, so you're basically adding len(A) references to
      the same D list to C. for more on this, see:
      >

      >
      </F>
      Ok!! Tank you very much, i understand now.

      ciao

      Comment

      • Gerrit Holl

        #4
        Re: matrix Multiplication

        On 2006-10-18 14:15:17 +0200, Sssasss wrote:
        Fredrik Lundh wrote:
        "Sssasss" wrote:
        I wan't to multiply two square matrixes, and i don't understand why it
        doesn't work.
        >
        def multmat(A,B):
        "A*B"
        if len(A)!=len(B): return "error"
        D=[]
        C=[]
        for i in range(len(A)): D.append(0)
        for i in range(len(A)): C.append(D)
        append doesn't copy data, so you're basically adding len(A) references to
        the same D list to C. for more on this, see:



        </F>
        >
        Ok!! Tank you very much, i understand now.
        You might also want to look at numpy/numarray.

        Gerrit.

        Comment

        • David

          #5
          Re: matrix Multiplication

          Il 18 Oct 2006 04:17:29 -0700, Sssasss ha scritto:
          hi evrybody!
          >
          I wan't to multiply two square matrixes, and i don't understand why it
          doesn't work.
          Can I suggest a little bit less cumbersome algorithm?

          def multmat2(A,B):
          "A*B"
          if len(A)!=len(B): return "error" # this check is not enough!
          n = range(len(A))
          C = []
          for i in n:
          C.append([0]*len(A)) # add a row to C
          for j in n:
          a = A[i] # get row i from A
          b = [row[j] for row in B] # get col j from B
          C[i][j] = sum([x*y for x,y in zip(a,b)])
          return C

          regards
          D.

          Comment

          • Roberto Bonvallet

            #6
            Re: matrix Multiplication

            Sssasss wrote:
            hi evrybody!
            >
            I wan't to multiply two square matrixes, and i don't understand why it
            doesn't work.
            Could you explain me?
            >
            def multmat(A,B):
            "A*B"
            if len(A)!=len(B): return "error"
            Wrong validation here: you _can_ multiply two matrices with a different
            number of rows! And instead of returning "error" you should raise an
            exception.

            [...]

            I suggest using a linear algebra package, but if you insist in using lists
            of lists:
            >>b = [[1, 2, 3, 4],
            .... [4, 5, 6, 7],
            .... [7, 8, 9, 10]]
            >>>
            >>a = [[1, 2, 3],
            .... [4, 5, 6]]
            >>>
            >>ab = [[sum(i*j for i, j in zip(row, col)) for col in zip(*b)] for row in a]
            >>ab
            [[30, 36, 42, 48], [66, 81, 96, 111]]

            Straightforward from the definition of matrix multiplication.
            --
            Roberto Bonvallet

            Comment

            • Sssasss

              #7
              Re: matrix Multiplication


              David wrote:
              Il 18 Oct 2006 04:17:29 -0700, Sssasss ha scritto:
              >
              hi evrybody!

              I wan't to multiply two square matrixes, and i don't understand why it
              doesn't work.
              Can I suggest a little bit less cumbersome algorithm?
              >
              def multmat2(A,B):
              "A*B"
              if len(A)!=len(B): return "error" # this check is not enough!
              n = range(len(A))
              C = []
              for i in n:
              C.append([0]*len(A)) # add a row to C
              for j in n:
              a = A[i] # get row i from A
              b = [row[j] for row in B] # get col j from B
              C[i][j] = sum([x*y for x,y in zip(a,b)])
              return C
              >
              regards
              D.
              This one is really nice, i didn't knew the zip function, thank you
              ciao

              Comment

              • Sssasss

                #8
                Re: matrix Multiplication


                Roberto Bonvallet wrote:
                Sssasss wrote:
                hi evrybody!

                I wan't to multiply two square matrixes, and i don't understand why it
                doesn't work.
                Could you explain me?

                def multmat(A,B):
                "A*B"
                if len(A)!=len(B): return "error"
                >
                Wrong validation here: you _can_ multiply two matrices with a different
                number of rows! And instead of returning "error" you should raise an
                exception.
                >
                [...]
                >
                I suggest using a linear algebra package, but if you insist in using lists
                of lists:
                >
                >b = [[1, 2, 3, 4],
                ... [4, 5, 6, 7],
                ... [7, 8, 9, 10]]
                >>
                >a = [[1, 2, 3],
                ... [4, 5, 6]]
                >>
                >ab = [[sum(i*j for i, j in zip(row, col)) for col in zip(*b)] for row in a]
                >ab
                [[30, 36, 42, 48], [66, 81, 96, 111]]
                >
                Straightforward from the definition of matrix multiplication.
                --
                Roberto Bonvallet
                Thank you, this one is very short!
                yes of course we can multiply different kinds of matrices, bu since
                I'm starting with python i started with something quick.

                ciao

                Comment

                Working...