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;
}
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
add a comment |
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
add a comment |
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
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
sml smlnj
edited Nov 21 '18 at 13:16
Simon Shine
10.2k13050
10.2k13050
asked Nov 16 '18 at 18:41
JanJan
305
305
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
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).
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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).
add a comment |
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).
add a comment |
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).
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).
answered Nov 21 '18 at 13:27
Simon ShineSimon Shine
10.2k13050
10.2k13050
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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