Julia - console behaving differently than include(“myfile.jl”)
up vote
1
down vote
favorite
I would like to execute the following code, which works perfectly well when I type every line into my Julia console on Windows 10, but throws an error because of the mismatching type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
(my subsequent code expects ArrayFloat64,2
).
This is the code:
x = [0.2, 0.1, 0.2]
y = [-0.5 0.0 0.5]
fx = x * y
fy = fx'
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
There is a TypeError, because fy
seems to be of type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
instead of ArrayFloat64,2
.
How can I do a transpose and get a "normal" ArrayFloat64,2 object ?
And why does this work when I type every line into my Julia console, but does not when I run the file via include("myfile.jl") ?
julia-lang
add a comment |
up vote
1
down vote
favorite
I would like to execute the following code, which works perfectly well when I type every line into my Julia console on Windows 10, but throws an error because of the mismatching type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
(my subsequent code expects ArrayFloat64,2
).
This is the code:
x = [0.2, 0.1, 0.2]
y = [-0.5 0.0 0.5]
fx = x * y
fy = fx'
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
There is a TypeError, because fy
seems to be of type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
instead of ArrayFloat64,2
.
How can I do a transpose and get a "normal" ArrayFloat64,2 object ?
And why does this work when I type every line into my Julia console, but does not when I run the file via include("myfile.jl") ?
julia-lang
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I would like to execute the following code, which works perfectly well when I type every line into my Julia console on Windows 10, but throws an error because of the mismatching type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
(my subsequent code expects ArrayFloat64,2
).
This is the code:
x = [0.2, 0.1, 0.2]
y = [-0.5 0.0 0.5]
fx = x * y
fy = fx'
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
There is a TypeError, because fy
seems to be of type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
instead of ArrayFloat64,2
.
How can I do a transpose and get a "normal" ArrayFloat64,2 object ?
And why does this work when I type every line into my Julia console, but does not when I run the file via include("myfile.jl") ?
julia-lang
I would like to execute the following code, which works perfectly well when I type every line into my Julia console on Windows 10, but throws an error because of the mismatching type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
(my subsequent code expects ArrayFloat64,2
).
This is the code:
x = [0.2, 0.1, 0.2]
y = [-0.5 0.0 0.5]
fx = x * y
fy = fx'
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
There is a TypeError, because fy
seems to be of type LinearAlgebra.AdjointFloat64,ArrayFloat64,2
instead of ArrayFloat64,2
.
How can I do a transpose and get a "normal" ArrayFloat64,2 object ?
And why does this work when I type every line into my Julia console, but does not when I run the file via include("myfile.jl") ?
julia-lang
julia-lang
asked Nov 10 at 14:35
cookiedealer
82212
82212
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
up vote
3
down vote
accepted
Use collect
to have a copy of actual data rather than a transformed view of the original (note that this rule applies to many other similar situations):
julia> x = [0.2, 0.1, 0.2];
julia> y = [-0.5 0.0 0.5];
julia> fx = x * y
3×3 ArrayFloat64,2:
-0.1 0.0 0.1
-0.05 0.0 0.05
-0.1 0.0 0.1
julia> fy = fx'
3×3 LinearAlgebra.AdjointFloat64,ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
julia> fy = collect(fx')
3×3 ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
This is a good solution, but one should make sure thatfx'
really gives them what they expected and if materializingfx'
is really needed as I have outlined in my answer.
– Bogumił Kamiński
Nov 10 at 15:31
Thank you, this was what I was looking for! :-)
– cookiedealer
Nov 10 at 15:35
add a comment |
up vote
2
down vote
To get a normal MatrixFloat64
use:
fy = permutedims(fx)
or
fy = Matrix(fx')
Those two are not 100% equivalent in general as fx'
is a recursive adjoint operation (conjugate transpose), while permutedims
is a non-recursive transpose, but in your case they will give the same result.
What does recursive adjoint mean exactly?
- recursive: the conjugate transpose is applied recursively to all entries of the array (in your case you have array of numbers and transpose of a number is the same number so this does not change anything);
- adjoint: if you would have complex numbers then the operation would return their complex conjugates (in your case you have real numbers so this does not change anything);
Here is an example when both things matter:
julia> x = [[im, -im], [1-im 1+im]]
2-element ArrayArrayComplexInt64,N where N,1:
[0+1im, 0-1im]
[1-1im 1+1im]
julia> permutedims(x)
1×2 ArrayArrayComplexInt64,N where N,2:
[0+1im, 0-1im] [1-1im 1+1im]
julia> Matrix(x')
1×2 ArrayAbstractArrayComplexInt64,N where N,2:
[0-1im 0+1im] [1+1im; 1-1im]
However, unless you really need to you do not have to do it if you really need to get a conjugate transpose of your data. It is enough to change type assertion to
return fx::ArrayFloat64,2, fy::AbstractArrayFloat64,2
or
return fx::MatrixFloat64, fy::AbstractMatrixFloat64
Conjugate transpose was designed to avoid unnecessary allocation of data and most of the time this will be more efficient for you (especially with large matrices).
Finally the line:
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
throws an error also in the Julia command line (not only when run from a script).
add a comment |
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
Use collect
to have a copy of actual data rather than a transformed view of the original (note that this rule applies to many other similar situations):
julia> x = [0.2, 0.1, 0.2];
julia> y = [-0.5 0.0 0.5];
julia> fx = x * y
3×3 ArrayFloat64,2:
-0.1 0.0 0.1
-0.05 0.0 0.05
-0.1 0.0 0.1
julia> fy = fx'
3×3 LinearAlgebra.AdjointFloat64,ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
julia> fy = collect(fx')
3×3 ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
This is a good solution, but one should make sure thatfx'
really gives them what they expected and if materializingfx'
is really needed as I have outlined in my answer.
– Bogumił Kamiński
Nov 10 at 15:31
Thank you, this was what I was looking for! :-)
– cookiedealer
Nov 10 at 15:35
add a comment |
up vote
3
down vote
accepted
Use collect
to have a copy of actual data rather than a transformed view of the original (note that this rule applies to many other similar situations):
julia> x = [0.2, 0.1, 0.2];
julia> y = [-0.5 0.0 0.5];
julia> fx = x * y
3×3 ArrayFloat64,2:
-0.1 0.0 0.1
-0.05 0.0 0.05
-0.1 0.0 0.1
julia> fy = fx'
3×3 LinearAlgebra.AdjointFloat64,ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
julia> fy = collect(fx')
3×3 ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
This is a good solution, but one should make sure thatfx'
really gives them what they expected and if materializingfx'
is really needed as I have outlined in my answer.
– Bogumił Kamiński
Nov 10 at 15:31
Thank you, this was what I was looking for! :-)
– cookiedealer
Nov 10 at 15:35
add a comment |
up vote
3
down vote
accepted
up vote
3
down vote
accepted
Use collect
to have a copy of actual data rather than a transformed view of the original (note that this rule applies to many other similar situations):
julia> x = [0.2, 0.1, 0.2];
julia> y = [-0.5 0.0 0.5];
julia> fx = x * y
3×3 ArrayFloat64,2:
-0.1 0.0 0.1
-0.05 0.0 0.05
-0.1 0.0 0.1
julia> fy = fx'
3×3 LinearAlgebra.AdjointFloat64,ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
julia> fy = collect(fx')
3×3 ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
Use collect
to have a copy of actual data rather than a transformed view of the original (note that this rule applies to many other similar situations):
julia> x = [0.2, 0.1, 0.2];
julia> y = [-0.5 0.0 0.5];
julia> fx = x * y
3×3 ArrayFloat64,2:
-0.1 0.0 0.1
-0.05 0.0 0.05
-0.1 0.0 0.1
julia> fy = fx'
3×3 LinearAlgebra.AdjointFloat64,ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
julia> fy = collect(fx')
3×3 ArrayFloat64,2:
-0.1 -0.05 -0.1
0.0 0.0 0.0
0.1 0.05 0.1
answered Nov 10 at 15:15
Przemyslaw Szufel
1,184110
1,184110
This is a good solution, but one should make sure thatfx'
really gives them what they expected and if materializingfx'
is really needed as I have outlined in my answer.
– Bogumił Kamiński
Nov 10 at 15:31
Thank you, this was what I was looking for! :-)
– cookiedealer
Nov 10 at 15:35
add a comment |
This is a good solution, but one should make sure thatfx'
really gives them what they expected and if materializingfx'
is really needed as I have outlined in my answer.
– Bogumił Kamiński
Nov 10 at 15:31
Thank you, this was what I was looking for! :-)
– cookiedealer
Nov 10 at 15:35
This is a good solution, but one should make sure that
fx'
really gives them what they expected and if materializing fx'
is really needed as I have outlined in my answer.– Bogumił Kamiński
Nov 10 at 15:31
This is a good solution, but one should make sure that
fx'
really gives them what they expected and if materializing fx'
is really needed as I have outlined in my answer.– Bogumił Kamiński
Nov 10 at 15:31
Thank you, this was what I was looking for! :-)
– cookiedealer
Nov 10 at 15:35
Thank you, this was what I was looking for! :-)
– cookiedealer
Nov 10 at 15:35
add a comment |
up vote
2
down vote
To get a normal MatrixFloat64
use:
fy = permutedims(fx)
or
fy = Matrix(fx')
Those two are not 100% equivalent in general as fx'
is a recursive adjoint operation (conjugate transpose), while permutedims
is a non-recursive transpose, but in your case they will give the same result.
What does recursive adjoint mean exactly?
- recursive: the conjugate transpose is applied recursively to all entries of the array (in your case you have array of numbers and transpose of a number is the same number so this does not change anything);
- adjoint: if you would have complex numbers then the operation would return their complex conjugates (in your case you have real numbers so this does not change anything);
Here is an example when both things matter:
julia> x = [[im, -im], [1-im 1+im]]
2-element ArrayArrayComplexInt64,N where N,1:
[0+1im, 0-1im]
[1-1im 1+1im]
julia> permutedims(x)
1×2 ArrayArrayComplexInt64,N where N,2:
[0+1im, 0-1im] [1-1im 1+1im]
julia> Matrix(x')
1×2 ArrayAbstractArrayComplexInt64,N where N,2:
[0-1im 0+1im] [1+1im; 1-1im]
However, unless you really need to you do not have to do it if you really need to get a conjugate transpose of your data. It is enough to change type assertion to
return fx::ArrayFloat64,2, fy::AbstractArrayFloat64,2
or
return fx::MatrixFloat64, fy::AbstractMatrixFloat64
Conjugate transpose was designed to avoid unnecessary allocation of data and most of the time this will be more efficient for you (especially with large matrices).
Finally the line:
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
throws an error also in the Julia command line (not only when run from a script).
add a comment |
up vote
2
down vote
To get a normal MatrixFloat64
use:
fy = permutedims(fx)
or
fy = Matrix(fx')
Those two are not 100% equivalent in general as fx'
is a recursive adjoint operation (conjugate transpose), while permutedims
is a non-recursive transpose, but in your case they will give the same result.
What does recursive adjoint mean exactly?
- recursive: the conjugate transpose is applied recursively to all entries of the array (in your case you have array of numbers and transpose of a number is the same number so this does not change anything);
- adjoint: if you would have complex numbers then the operation would return their complex conjugates (in your case you have real numbers so this does not change anything);
Here is an example when both things matter:
julia> x = [[im, -im], [1-im 1+im]]
2-element ArrayArrayComplexInt64,N where N,1:
[0+1im, 0-1im]
[1-1im 1+1im]
julia> permutedims(x)
1×2 ArrayArrayComplexInt64,N where N,2:
[0+1im, 0-1im] [1-1im 1+1im]
julia> Matrix(x')
1×2 ArrayAbstractArrayComplexInt64,N where N,2:
[0-1im 0+1im] [1+1im; 1-1im]
However, unless you really need to you do not have to do it if you really need to get a conjugate transpose of your data. It is enough to change type assertion to
return fx::ArrayFloat64,2, fy::AbstractArrayFloat64,2
or
return fx::MatrixFloat64, fy::AbstractMatrixFloat64
Conjugate transpose was designed to avoid unnecessary allocation of data and most of the time this will be more efficient for you (especially with large matrices).
Finally the line:
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
throws an error also in the Julia command line (not only when run from a script).
add a comment |
up vote
2
down vote
up vote
2
down vote
To get a normal MatrixFloat64
use:
fy = permutedims(fx)
or
fy = Matrix(fx')
Those two are not 100% equivalent in general as fx'
is a recursive adjoint operation (conjugate transpose), while permutedims
is a non-recursive transpose, but in your case they will give the same result.
What does recursive adjoint mean exactly?
- recursive: the conjugate transpose is applied recursively to all entries of the array (in your case you have array of numbers and transpose of a number is the same number so this does not change anything);
- adjoint: if you would have complex numbers then the operation would return their complex conjugates (in your case you have real numbers so this does not change anything);
Here is an example when both things matter:
julia> x = [[im, -im], [1-im 1+im]]
2-element ArrayArrayComplexInt64,N where N,1:
[0+1im, 0-1im]
[1-1im 1+1im]
julia> permutedims(x)
1×2 ArrayArrayComplexInt64,N where N,2:
[0+1im, 0-1im] [1-1im 1+1im]
julia> Matrix(x')
1×2 ArrayAbstractArrayComplexInt64,N where N,2:
[0-1im 0+1im] [1+1im; 1-1im]
However, unless you really need to you do not have to do it if you really need to get a conjugate transpose of your data. It is enough to change type assertion to
return fx::ArrayFloat64,2, fy::AbstractArrayFloat64,2
or
return fx::MatrixFloat64, fy::AbstractMatrixFloat64
Conjugate transpose was designed to avoid unnecessary allocation of data and most of the time this will be more efficient for you (especially with large matrices).
Finally the line:
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
throws an error also in the Julia command line (not only when run from a script).
To get a normal MatrixFloat64
use:
fy = permutedims(fx)
or
fy = Matrix(fx')
Those two are not 100% equivalent in general as fx'
is a recursive adjoint operation (conjugate transpose), while permutedims
is a non-recursive transpose, but in your case they will give the same result.
What does recursive adjoint mean exactly?
- recursive: the conjugate transpose is applied recursively to all entries of the array (in your case you have array of numbers and transpose of a number is the same number so this does not change anything);
- adjoint: if you would have complex numbers then the operation would return their complex conjugates (in your case you have real numbers so this does not change anything);
Here is an example when both things matter:
julia> x = [[im, -im], [1-im 1+im]]
2-element ArrayArrayComplexInt64,N where N,1:
[0+1im, 0-1im]
[1-1im 1+1im]
julia> permutedims(x)
1×2 ArrayArrayComplexInt64,N where N,2:
[0+1im, 0-1im] [1-1im 1+1im]
julia> Matrix(x')
1×2 ArrayAbstractArrayComplexInt64,N where N,2:
[0-1im 0+1im] [1+1im; 1-1im]
However, unless you really need to you do not have to do it if you really need to get a conjugate transpose of your data. It is enough to change type assertion to
return fx::ArrayFloat64,2, fy::AbstractArrayFloat64,2
or
return fx::MatrixFloat64, fy::AbstractMatrixFloat64
Conjugate transpose was designed to avoid unnecessary allocation of data and most of the time this will be more efficient for you (especially with large matrices).
Finally the line:
return fx::ArrayFloat64,2, fy::ArrayFloat64,2
throws an error also in the Julia command line (not only when run from a script).
edited Nov 10 at 15:21
answered Nov 10 at 15:16
Bogumił Kamiński
10.7k11019
10.7k11019
add a comment |
add a comment |
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%2f53239982%2fjulia-console-behaving-differently-than-includemyfile-jl%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