Multiply two matrices in SML





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















I want to write a function in SML/NJ which will take 2 matrices as an arguments and it will multiply them.



I can only use:





  • function dot, which take 2 vectors and calculate scalar product:



    fun dot (xs: int list, ys: int list): int =
    List.foldl (fn (x,y) => x+y)
    0
    (ListPair.map (fn (x,y) => x*y) (xs, ys))



  • function transpose, which take 1 matrix and calculate transpose of this matrix:



    fun transpose (m: 'a list list): 'a list list =
    List.tabulate (List.length (List.nth (m, 0)),
    fn x => List.map (fn y => (List.nth (y, x))) m)



    • anonymous function


    • structures List, ListPair and Math





The function I want to write should be like this:



fun multiply (a: int list list, b: int list list): int list list


So far I have done this:



fun multiply (a: int list list, b: int list list): int list list =
case a of
=>
| g::rep => [(List.map (fn y => dot(g, y)) transpose(b))] @ (multiply(rep, b))


But I got this error:



test.sml:66.21-66.62 Error: operator and operand do not agree [tycon mismatch]
operator domain: int list list
operand: 'Z list list -> 'Z list list
in expression:
(List.map (fn y => dot <exp>)) transpose


I get no errors, if in the last line of function multiply I write b instead of tranpose(b), but of course, if I do this, I don't the the resoult I want:



fun multiply (a: int list list, b: int list list): int list list =
case a of
=>
| g::rep => [(List.map (fn y => dot(g, y)) b)] @ (multiply(rep, b))


I don't know what else should I do. Can anybody pease help me?










share|improve this question































    0















    I want to write a function in SML/NJ which will take 2 matrices as an arguments and it will multiply them.



    I can only use:





    • function dot, which take 2 vectors and calculate scalar product:



      fun dot (xs: int list, ys: int list): int =
      List.foldl (fn (x,y) => x+y)
      0
      (ListPair.map (fn (x,y) => x*y) (xs, ys))



    • function transpose, which take 1 matrix and calculate transpose of this matrix:



      fun transpose (m: 'a list list): 'a list list =
      List.tabulate (List.length (List.nth (m, 0)),
      fn x => List.map (fn y => (List.nth (y, x))) m)



      • anonymous function


      • structures List, ListPair and Math





    The function I want to write should be like this:



    fun multiply (a: int list list, b: int list list): int list list


    So far I have done this:



    fun multiply (a: int list list, b: int list list): int list list =
    case a of
    =>
    | g::rep => [(List.map (fn y => dot(g, y)) transpose(b))] @ (multiply(rep, b))


    But I got this error:



    test.sml:66.21-66.62 Error: operator and operand do not agree [tycon mismatch]
    operator domain: int list list
    operand: 'Z list list -> 'Z list list
    in expression:
    (List.map (fn y => dot <exp>)) transpose


    I get no errors, if in the last line of function multiply I write b instead of tranpose(b), but of course, if I do this, I don't the the resoult I want:



    fun multiply (a: int list list, b: int list list): int list list =
    case a of
    =>
    | g::rep => [(List.map (fn y => dot(g, y)) b)] @ (multiply(rep, b))


    I don't know what else should I do. Can anybody pease help me?










    share|improve this question



























      0












      0








      0








      I want to write a function in SML/NJ which will take 2 matrices as an arguments and it will multiply them.



      I can only use:





      • function dot, which take 2 vectors and calculate scalar product:



        fun dot (xs: int list, ys: int list): int =
        List.foldl (fn (x,y) => x+y)
        0
        (ListPair.map (fn (x,y) => x*y) (xs, ys))



      • function transpose, which take 1 matrix and calculate transpose of this matrix:



        fun transpose (m: 'a list list): 'a list list =
        List.tabulate (List.length (List.nth (m, 0)),
        fn x => List.map (fn y => (List.nth (y, x))) m)



        • anonymous function


        • structures List, ListPair and Math





      The function I want to write should be like this:



      fun multiply (a: int list list, b: int list list): int list list


      So far I have done this:



      fun multiply (a: int list list, b: int list list): int list list =
      case a of
      =>
      | g::rep => [(List.map (fn y => dot(g, y)) transpose(b))] @ (multiply(rep, b))


      But I got this error:



      test.sml:66.21-66.62 Error: operator and operand do not agree [tycon mismatch]
      operator domain: int list list
      operand: 'Z list list -> 'Z list list
      in expression:
      (List.map (fn y => dot <exp>)) transpose


      I get no errors, if in the last line of function multiply I write b instead of tranpose(b), but of course, if I do this, I don't the the resoult I want:



      fun multiply (a: int list list, b: int list list): int list list =
      case a of
      =>
      | g::rep => [(List.map (fn y => dot(g, y)) b)] @ (multiply(rep, b))


      I don't know what else should I do. Can anybody pease help me?










      share|improve this question
















      I want to write a function in SML/NJ which will take 2 matrices as an arguments and it will multiply them.



      I can only use:





      • function dot, which take 2 vectors and calculate scalar product:



        fun dot (xs: int list, ys: int list): int =
        List.foldl (fn (x,y) => x+y)
        0
        (ListPair.map (fn (x,y) => x*y) (xs, ys))



      • function transpose, which take 1 matrix and calculate transpose of this matrix:



        fun transpose (m: 'a list list): 'a list list =
        List.tabulate (List.length (List.nth (m, 0)),
        fn x => List.map (fn y => (List.nth (y, x))) m)



        • anonymous function


        • structures List, ListPair and Math





      The function I want to write should be like this:



      fun multiply (a: int list list, b: int list list): int list list


      So far I have done this:



      fun multiply (a: int list list, b: int list list): int list list =
      case a of
      =>
      | g::rep => [(List.map (fn y => dot(g, y)) transpose(b))] @ (multiply(rep, b))


      But I got this error:



      test.sml:66.21-66.62 Error: operator and operand do not agree [tycon mismatch]
      operator domain: int list list
      operand: 'Z list list -> 'Z list list
      in expression:
      (List.map (fn y => dot <exp>)) transpose


      I get no errors, if in the last line of function multiply I write b instead of tranpose(b), but of course, if I do this, I don't the the resoult I want:



      fun multiply (a: int list list, b: int list list): int list list =
      case a of
      =>
      | g::rep => [(List.map (fn y => dot(g, y)) b)] @ (multiply(rep, b))


      I don't know what else should I do. Can anybody pease help me?







      sml smlnj






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 13:16









      Simon Shine

      10.2k13050




      10.2k13050










      asked Nov 16 '18 at 18:41









      JanJan

      305




      305
























          1 Answer
          1






          active

          oldest

          votes


















          1














          There exists a solution for OCaml on RosettaCode that you can translate.



          Given the illustration,



                   | [ a,   [ c,
          | b ] d ]
          ---------+-------------
          [ 1, 2 ] | w x
          [ 3, 4 ] | y z


          then for each row in the first matrix, calculate the dot product with the same number column of the second matrix. I.e. w = dot ([1, 2], [a, b]). Extracting the rows of the first matrix is easy, since you can use list recursion.



          Extracting the columns of the second matrix is less easy, because they are orthogonal to the list representation (i.e. a is the first element of the first row, b is the first element of the second row, c is the second element of the first row, and d is the second element of the second row.



          You can simplify extracting columns from the second matrix by performing a transpose in which case extracting columns becomes equivalent to extracting rows. At this point you can take the pairwise dot product of "rows" (that is, rows in the first matrix and transposed columns ("rows") in the second matrix).



          I would encourage the use of Array2 for this type of operations, since you also avoid error handling when your "matrices" (lists) are jagged (have different row lengths).






          share|improve this answer
























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53343634%2fmultiply-two-matrices-in-sml%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            There exists a solution for OCaml on RosettaCode that you can translate.



            Given the illustration,



                     | [ a,   [ c,
            | b ] d ]
            ---------+-------------
            [ 1, 2 ] | w x
            [ 3, 4 ] | y z


            then for each row in the first matrix, calculate the dot product with the same number column of the second matrix. I.e. w = dot ([1, 2], [a, b]). Extracting the rows of the first matrix is easy, since you can use list recursion.



            Extracting the columns of the second matrix is less easy, because they are orthogonal to the list representation (i.e. a is the first element of the first row, b is the first element of the second row, c is the second element of the first row, and d is the second element of the second row.



            You can simplify extracting columns from the second matrix by performing a transpose in which case extracting columns becomes equivalent to extracting rows. At this point you can take the pairwise dot product of "rows" (that is, rows in the first matrix and transposed columns ("rows") in the second matrix).



            I would encourage the use of Array2 for this type of operations, since you also avoid error handling when your "matrices" (lists) are jagged (have different row lengths).






            share|improve this answer




























              1














              There exists a solution for OCaml on RosettaCode that you can translate.



              Given the illustration,



                       | [ a,   [ c,
              | b ] d ]
              ---------+-------------
              [ 1, 2 ] | w x
              [ 3, 4 ] | y z


              then for each row in the first matrix, calculate the dot product with the same number column of the second matrix. I.e. w = dot ([1, 2], [a, b]). Extracting the rows of the first matrix is easy, since you can use list recursion.



              Extracting the columns of the second matrix is less easy, because they are orthogonal to the list representation (i.e. a is the first element of the first row, b is the first element of the second row, c is the second element of the first row, and d is the second element of the second row.



              You can simplify extracting columns from the second matrix by performing a transpose in which case extracting columns becomes equivalent to extracting rows. At this point you can take the pairwise dot product of "rows" (that is, rows in the first matrix and transposed columns ("rows") in the second matrix).



              I would encourage the use of Array2 for this type of operations, since you also avoid error handling when your "matrices" (lists) are jagged (have different row lengths).






              share|improve this answer


























                1












                1








                1







                There exists a solution for OCaml on RosettaCode that you can translate.



                Given the illustration,



                         | [ a,   [ c,
                | b ] d ]
                ---------+-------------
                [ 1, 2 ] | w x
                [ 3, 4 ] | y z


                then for each row in the first matrix, calculate the dot product with the same number column of the second matrix. I.e. w = dot ([1, 2], [a, b]). Extracting the rows of the first matrix is easy, since you can use list recursion.



                Extracting the columns of the second matrix is less easy, because they are orthogonal to the list representation (i.e. a is the first element of the first row, b is the first element of the second row, c is the second element of the first row, and d is the second element of the second row.



                You can simplify extracting columns from the second matrix by performing a transpose in which case extracting columns becomes equivalent to extracting rows. At this point you can take the pairwise dot product of "rows" (that is, rows in the first matrix and transposed columns ("rows") in the second matrix).



                I would encourage the use of Array2 for this type of operations, since you also avoid error handling when your "matrices" (lists) are jagged (have different row lengths).






                share|improve this answer













                There exists a solution for OCaml on RosettaCode that you can translate.



                Given the illustration,



                         | [ a,   [ c,
                | b ] d ]
                ---------+-------------
                [ 1, 2 ] | w x
                [ 3, 4 ] | y z


                then for each row in the first matrix, calculate the dot product with the same number column of the second matrix. I.e. w = dot ([1, 2], [a, b]). Extracting the rows of the first matrix is easy, since you can use list recursion.



                Extracting the columns of the second matrix is less easy, because they are orthogonal to the list representation (i.e. a is the first element of the first row, b is the first element of the second row, c is the second element of the first row, and d is the second element of the second row.



                You can simplify extracting columns from the second matrix by performing a transpose in which case extracting columns becomes equivalent to extracting rows. At this point you can take the pairwise dot product of "rows" (that is, rows in the first matrix and transposed columns ("rows") in the second matrix).



                I would encourage the use of Array2 for this type of operations, since you also avoid error handling when your "matrices" (lists) are jagged (have different row lengths).







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 21 '18 at 13:27









                Simon ShineSimon Shine

                10.2k13050




                10.2k13050
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53343634%2fmultiply-two-matrices-in-sml%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Florida Star v. B. J. F.

                    Danny Elfman

                    Retrieve a Users Dashboard in Tumblr with R and TumblR. Oauth Issues