Fast element-wise division of matrix, generated from vector with `Outer`, and another matrix
Clash Royale CLAN TAG#URR8PPP
m = a, b, c;
n = e, r, t, y, u, i, g, h, j;
k = Outer[Divide, m, m];
k/n
gives
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),
1/j
I want to do this with very large matrices filled with numbers of arbitrary precision. Is there a faster way?
EDIT
The sizes I am looking at for my practical applications start at 20000 and 20000^2 for the vector and matrix, respectively (of course the examples don't have to be with that many).
I am also interested in any method that might parallelise well.
list-manipulation matrix performance-tuning array
add a comment |
m = a, b, c;
n = e, r, t, y, u, i, g, h, j;
k = Outer[Divide, m, m];
k/n
gives
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),
1/j
I want to do this with very large matrices filled with numbers of arbitrary precision. Is there a faster way?
EDIT
The sizes I am looking at for my practical applications start at 20000 and 20000^2 for the vector and matrix, respectively (of course the examples don't have to be with that many).
I am also interested in any method that might parallelise well.
list-manipulation matrix performance-tuning array
What is the length ofm
in practical use?
– Αλέξανδρος Ζεγγ
Dec 13 at 3:03
You can trym/(n ConstantArray[m, Length[m]])
and see how fast it is.
– C. E.
Dec 13 at 5:22
@ΑλέξανδροςΖεγγ I editted my question to include some information on that.
– ThunderBiggi
Dec 13 at 6:46
add a comment |
m = a, b, c;
n = e, r, t, y, u, i, g, h, j;
k = Outer[Divide, m, m];
k/n
gives
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),
1/j
I want to do this with very large matrices filled with numbers of arbitrary precision. Is there a faster way?
EDIT
The sizes I am looking at for my practical applications start at 20000 and 20000^2 for the vector and matrix, respectively (of course the examples don't have to be with that many).
I am also interested in any method that might parallelise well.
list-manipulation matrix performance-tuning array
m = a, b, c;
n = e, r, t, y, u, i, g, h, j;
k = Outer[Divide, m, m];
k/n
gives
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),
1/j
I want to do this with very large matrices filled with numbers of arbitrary precision. Is there a faster way?
EDIT
The sizes I am looking at for my practical applications start at 20000 and 20000^2 for the vector and matrix, respectively (of course the examples don't have to be with that many).
I am also interested in any method that might parallelise well.
list-manipulation matrix performance-tuning array
list-manipulation matrix performance-tuning array
edited Dec 13 at 6:45
asked Dec 12 at 23:45
ThunderBiggi
383112
383112
What is the length ofm
in practical use?
– Αλέξανδρος Ζεγγ
Dec 13 at 3:03
You can trym/(n ConstantArray[m, Length[m]])
and see how fast it is.
– C. E.
Dec 13 at 5:22
@ΑλέξανδροςΖεγγ I editted my question to include some information on that.
– ThunderBiggi
Dec 13 at 6:46
add a comment |
What is the length ofm
in practical use?
– Αλέξανδρος Ζεγγ
Dec 13 at 3:03
You can trym/(n ConstantArray[m, Length[m]])
and see how fast it is.
– C. E.
Dec 13 at 5:22
@ΑλέξανδροςΖεγγ I editted my question to include some information on that.
– ThunderBiggi
Dec 13 at 6:46
What is the length of
m
in practical use?– Αλέξανδρος Ζεγγ
Dec 13 at 3:03
What is the length of
m
in practical use?– Αλέξανδρος Ζεγγ
Dec 13 at 3:03
You can try
m/(n ConstantArray[m, Length[m]])
and see how fast it is.– C. E.
Dec 13 at 5:22
You can try
m/(n ConstantArray[m, Length[m]])
and see how fast it is.– C. E.
Dec 13 at 5:22
@ΑλέξανδροςΖεγγ I editted my question to include some information on that.
– ThunderBiggi
Dec 13 at 6:46
@ΑλέξανδροςΖεγγ I editted my question to include some information on that.
– ThunderBiggi
Dec 13 at 6:46
add a comment |
2 Answers
2
active
oldest
votes
m = RandomReal[-1, 1, 2000];
n = RandomReal[-1, 1, 2000, 2000];
a = Outer[Divide, m, m]/n; // RepeatedTiming // First
b = Map[#/m &, MapThread[#1 #2 &, m, 1/n]]; //
RepeatedTiming // First
c = m /(ConstantArray[m, Length[m]] n); // RepeatedTiming // First
d = KroneckerProduct[m, 1./m]/n; // RepeatedTiming // First
a == b == c == d
0.958
0.128
0.0281
0.0236
True
Edit
A parallelized version
cf = Compile[x, _Real, y, _Real, 1, z, _Real, 1,
x/(y z),
CompilationTarget -> "C",
RuntimeAttributes -> Listable,
Parallelization -> True,
RuntimeOptions -> "Speed"
];
e = cf[m, n, m]; // RepeatedTiming // First
a == e
0.0096
True
Timing has been measured on a Quad Core CPU which shows that this does not scale too well. Btw., the timing with CompilationTarget -> "C"
is only 4% slower, so there is always no point to compile it into a library.
I was just typing a comparison of the answers so far, but you were first. I wouldn't've expected thatKroneckerProduct
would be that quick. Any ideas on any way that might parallelise well? I will edit my question to include that as well.
– ThunderBiggi
Dec 13 at 6:43
See my edit for a parallelized version.
– Henrik Schumacher
Dec 13 at 7:03
I am using arbitrary precision numbers, so I guess 'Compile' is not really an option.
– ThunderBiggi
Dec 13 at 7:38
Also, interestingly, but on my machine, with Mathematica 11.3,a
is faster thanb
though still slower than the other two.
– ThunderBiggi
Dec 13 at 7:42
Yeah, I was also surprised thata
was so slow on my machine. I don't know what to think about it...
– Henrik Schumacher
Dec 13 at 7:51
|
show 1 more comment
Pretty printing your result gives...
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),1/j//MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
Try this, it avoids constructing the huge Outer[ ] matrix
Map[#/m &, MapThread[#1 #2 &, m, 1/n]] // MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
);
);
, "mathjax-editing");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "387"
;
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: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
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%2fmathematica.stackexchange.com%2fquestions%2f187804%2ffast-element-wise-division-of-matrix-generated-from-vector-with-outer-and-an%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
m = RandomReal[-1, 1, 2000];
n = RandomReal[-1, 1, 2000, 2000];
a = Outer[Divide, m, m]/n; // RepeatedTiming // First
b = Map[#/m &, MapThread[#1 #2 &, m, 1/n]]; //
RepeatedTiming // First
c = m /(ConstantArray[m, Length[m]] n); // RepeatedTiming // First
d = KroneckerProduct[m, 1./m]/n; // RepeatedTiming // First
a == b == c == d
0.958
0.128
0.0281
0.0236
True
Edit
A parallelized version
cf = Compile[x, _Real, y, _Real, 1, z, _Real, 1,
x/(y z),
CompilationTarget -> "C",
RuntimeAttributes -> Listable,
Parallelization -> True,
RuntimeOptions -> "Speed"
];
e = cf[m, n, m]; // RepeatedTiming // First
a == e
0.0096
True
Timing has been measured on a Quad Core CPU which shows that this does not scale too well. Btw., the timing with CompilationTarget -> "C"
is only 4% slower, so there is always no point to compile it into a library.
I was just typing a comparison of the answers so far, but you were first. I wouldn't've expected thatKroneckerProduct
would be that quick. Any ideas on any way that might parallelise well? I will edit my question to include that as well.
– ThunderBiggi
Dec 13 at 6:43
See my edit for a parallelized version.
– Henrik Schumacher
Dec 13 at 7:03
I am using arbitrary precision numbers, so I guess 'Compile' is not really an option.
– ThunderBiggi
Dec 13 at 7:38
Also, interestingly, but on my machine, with Mathematica 11.3,a
is faster thanb
though still slower than the other two.
– ThunderBiggi
Dec 13 at 7:42
Yeah, I was also surprised thata
was so slow on my machine. I don't know what to think about it...
– Henrik Schumacher
Dec 13 at 7:51
|
show 1 more comment
m = RandomReal[-1, 1, 2000];
n = RandomReal[-1, 1, 2000, 2000];
a = Outer[Divide, m, m]/n; // RepeatedTiming // First
b = Map[#/m &, MapThread[#1 #2 &, m, 1/n]]; //
RepeatedTiming // First
c = m /(ConstantArray[m, Length[m]] n); // RepeatedTiming // First
d = KroneckerProduct[m, 1./m]/n; // RepeatedTiming // First
a == b == c == d
0.958
0.128
0.0281
0.0236
True
Edit
A parallelized version
cf = Compile[x, _Real, y, _Real, 1, z, _Real, 1,
x/(y z),
CompilationTarget -> "C",
RuntimeAttributes -> Listable,
Parallelization -> True,
RuntimeOptions -> "Speed"
];
e = cf[m, n, m]; // RepeatedTiming // First
a == e
0.0096
True
Timing has been measured on a Quad Core CPU which shows that this does not scale too well. Btw., the timing with CompilationTarget -> "C"
is only 4% slower, so there is always no point to compile it into a library.
I was just typing a comparison of the answers so far, but you were first. I wouldn't've expected thatKroneckerProduct
would be that quick. Any ideas on any way that might parallelise well? I will edit my question to include that as well.
– ThunderBiggi
Dec 13 at 6:43
See my edit for a parallelized version.
– Henrik Schumacher
Dec 13 at 7:03
I am using arbitrary precision numbers, so I guess 'Compile' is not really an option.
– ThunderBiggi
Dec 13 at 7:38
Also, interestingly, but on my machine, with Mathematica 11.3,a
is faster thanb
though still slower than the other two.
– ThunderBiggi
Dec 13 at 7:42
Yeah, I was also surprised thata
was so slow on my machine. I don't know what to think about it...
– Henrik Schumacher
Dec 13 at 7:51
|
show 1 more comment
m = RandomReal[-1, 1, 2000];
n = RandomReal[-1, 1, 2000, 2000];
a = Outer[Divide, m, m]/n; // RepeatedTiming // First
b = Map[#/m &, MapThread[#1 #2 &, m, 1/n]]; //
RepeatedTiming // First
c = m /(ConstantArray[m, Length[m]] n); // RepeatedTiming // First
d = KroneckerProduct[m, 1./m]/n; // RepeatedTiming // First
a == b == c == d
0.958
0.128
0.0281
0.0236
True
Edit
A parallelized version
cf = Compile[x, _Real, y, _Real, 1, z, _Real, 1,
x/(y z),
CompilationTarget -> "C",
RuntimeAttributes -> Listable,
Parallelization -> True,
RuntimeOptions -> "Speed"
];
e = cf[m, n, m]; // RepeatedTiming // First
a == e
0.0096
True
Timing has been measured on a Quad Core CPU which shows that this does not scale too well. Btw., the timing with CompilationTarget -> "C"
is only 4% slower, so there is always no point to compile it into a library.
m = RandomReal[-1, 1, 2000];
n = RandomReal[-1, 1, 2000, 2000];
a = Outer[Divide, m, m]/n; // RepeatedTiming // First
b = Map[#/m &, MapThread[#1 #2 &, m, 1/n]]; //
RepeatedTiming // First
c = m /(ConstantArray[m, Length[m]] n); // RepeatedTiming // First
d = KroneckerProduct[m, 1./m]/n; // RepeatedTiming // First
a == b == c == d
0.958
0.128
0.0281
0.0236
True
Edit
A parallelized version
cf = Compile[x, _Real, y, _Real, 1, z, _Real, 1,
x/(y z),
CompilationTarget -> "C",
RuntimeAttributes -> Listable,
Parallelization -> True,
RuntimeOptions -> "Speed"
];
e = cf[m, n, m]; // RepeatedTiming // First
a == e
0.0096
True
Timing has been measured on a Quad Core CPU which shows that this does not scale too well. Btw., the timing with CompilationTarget -> "C"
is only 4% slower, so there is always no point to compile it into a library.
edited Dec 13 at 7:03
answered Dec 13 at 6:32
Henrik Schumacher
48.1k467136
48.1k467136
I was just typing a comparison of the answers so far, but you were first. I wouldn't've expected thatKroneckerProduct
would be that quick. Any ideas on any way that might parallelise well? I will edit my question to include that as well.
– ThunderBiggi
Dec 13 at 6:43
See my edit for a parallelized version.
– Henrik Schumacher
Dec 13 at 7:03
I am using arbitrary precision numbers, so I guess 'Compile' is not really an option.
– ThunderBiggi
Dec 13 at 7:38
Also, interestingly, but on my machine, with Mathematica 11.3,a
is faster thanb
though still slower than the other two.
– ThunderBiggi
Dec 13 at 7:42
Yeah, I was also surprised thata
was so slow on my machine. I don't know what to think about it...
– Henrik Schumacher
Dec 13 at 7:51
|
show 1 more comment
I was just typing a comparison of the answers so far, but you were first. I wouldn't've expected thatKroneckerProduct
would be that quick. Any ideas on any way that might parallelise well? I will edit my question to include that as well.
– ThunderBiggi
Dec 13 at 6:43
See my edit for a parallelized version.
– Henrik Schumacher
Dec 13 at 7:03
I am using arbitrary precision numbers, so I guess 'Compile' is not really an option.
– ThunderBiggi
Dec 13 at 7:38
Also, interestingly, but on my machine, with Mathematica 11.3,a
is faster thanb
though still slower than the other two.
– ThunderBiggi
Dec 13 at 7:42
Yeah, I was also surprised thata
was so slow on my machine. I don't know what to think about it...
– Henrik Schumacher
Dec 13 at 7:51
I was just typing a comparison of the answers so far, but you were first. I wouldn't've expected that
KroneckerProduct
would be that quick. Any ideas on any way that might parallelise well? I will edit my question to include that as well.– ThunderBiggi
Dec 13 at 6:43
I was just typing a comparison of the answers so far, but you were first. I wouldn't've expected that
KroneckerProduct
would be that quick. Any ideas on any way that might parallelise well? I will edit my question to include that as well.– ThunderBiggi
Dec 13 at 6:43
See my edit for a parallelized version.
– Henrik Schumacher
Dec 13 at 7:03
See my edit for a parallelized version.
– Henrik Schumacher
Dec 13 at 7:03
I am using arbitrary precision numbers, so I guess 'Compile' is not really an option.
– ThunderBiggi
Dec 13 at 7:38
I am using arbitrary precision numbers, so I guess 'Compile' is not really an option.
– ThunderBiggi
Dec 13 at 7:38
Also, interestingly, but on my machine, with Mathematica 11.3,
a
is faster than b
though still slower than the other two.– ThunderBiggi
Dec 13 at 7:42
Also, interestingly, but on my machine, with Mathematica 11.3,
a
is faster than b
though still slower than the other two.– ThunderBiggi
Dec 13 at 7:42
Yeah, I was also surprised that
a
was so slow on my machine. I don't know what to think about it...– Henrik Schumacher
Dec 13 at 7:51
Yeah, I was also surprised that
a
was so slow on my machine. I don't know what to think about it...– Henrik Schumacher
Dec 13 at 7:51
|
show 1 more comment
Pretty printing your result gives...
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),1/j//MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
Try this, it avoids constructing the huge Outer[ ] matrix
Map[#/m &, MapThread[#1 #2 &, m, 1/n]] // MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
add a comment |
Pretty printing your result gives...
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),1/j//MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
Try this, it avoids constructing the huge Outer[ ] matrix
Map[#/m &, MapThread[#1 #2 &, m, 1/n]] // MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
add a comment |
Pretty printing your result gives...
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),1/j//MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
Try this, it avoids constructing the huge Outer[ ] matrix
Map[#/m &, MapThread[#1 #2 &, m, 1/n]] // MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
Pretty printing your result gives...
1/e, a/(b r), a/(c t), b/(a y), 1/u, b/(c i), c/(a g), c/(b h),1/j//MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
Try this, it avoids constructing the huge Outer[ ] matrix
Map[#/m &, MapThread[#1 #2 &, m, 1/n]] // MatrixForm
$left(
beginarrayccc
frac1e & fracab r & fracac t \
fracba y & frac1u & fracbc i \
fracca g & fraccb h & frac1j \
endarray
right)$
answered Dec 13 at 0:43
MikeY
1,942410
1,942410
add a comment |
add a comment |
Thanks for contributing an answer to Mathematica Stack Exchange!
- 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.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2fmathematica.stackexchange.com%2fquestions%2f187804%2ffast-element-wise-division-of-matrix-generated-from-vector-with-outer-and-an%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
What is the length of
m
in practical use?– Αλέξανδρος Ζεγγ
Dec 13 at 3:03
You can try
m/(n ConstantArray[m, Length[m]])
and see how fast it is.– C. E.
Dec 13 at 5:22
@ΑλέξανδροςΖεγγ I editted my question to include some information on that.
– ThunderBiggi
Dec 13 at 6:46