Dear all,
In matlab, we can add complex values into zeros matrix, but in Julia I cannot .Can you help me to modify my codes to add complex values into zeros matrix in Julia?
This is the matlab code.
>> A = zeros(2, 2)
A =
0 0
0 0
>> A(1, 1) = 1 + i
A =
1.0000 + 1.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i
And this the Julia codes, but it get an error.
julia> A = zeros(3, 3)
3×3 Matrix{Float64}:
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
julia> A[1, 1] = 1 + im
ERROR: InexactError: Float64(1 + 1im)
Stacktrace:
[1] Real
@ ./complex.jl:44 [inlined]
[2] convert
@ ./number.jl:7 [inlined]
[3] setindex!(::Matrix{Float64}, ::Complex{Int64}, ::Int64, ::Int64)
@ Base ./array.jl:905
[4] top-level scope
@ REPL[24]:1
Any help will be appreciated.
Maybe you want this?
julia> A = zeros(Complex, 3, 3);
julia> A[1,1] = 1 + im
3×3 Matrix{Complex}:
1+1im 0+0im 0+0im
0+0im 0+0im 0+0im
0+0im 0+0im 0+0im
3 Likes
I try to modify the Julia code like below, is it right?
julia> A = convert(Array{Any}, zeros(2, 2))
2×2 Matrix{Any}:
0.0 0.0
0.0 0.0
julia> A[1, 1] = 1 + im
1 + 1im
julia> A
2×2 Matrix{Any}:
1+1im 0.0
0.0 0.0
The matrix contains elements of mixed types. It generally will deteriorate your performance.
2 Likes
Since Complex
is not a concrete type, this will also give you bad performance. Use zeros(Complex{Float64}, 3, 3)
instead.
6 Likes
Sure, you are right. My bad.
@liuyxpp @sostock Thanks so much. It solves my problem.
@liuyxpp @sostock I have another question. How can I transform this matlab code into Julia.
>> val = zeros(3, 3);
>> row = zeros(3, 3);
>> A = [1 2 3; 6 5 1; 1 7 4]
A =
1 2 3
6 5 1
1 7 4
[val(1, :), row(1, :)] = max(A)
val =
6 7 4
0 0 0
0 0 0
row =
2 3 3
0 0 0
0 0 0
I then suggest reading this part of doc carefully Noteworthy Differences from other Languages · The Julia Language. And learn Julia Array syntax from the beginning. Otherwise, your question list will continue to grow.
8 Likes
Thanks for your suggetion. I will read it.
You probably want something like
julia> A
3×3 Matrix{Int64}:
1 2 3
6 5 1
1 7 4
julia> vals, inds = findmax(A, dims=1)
([6 7 4], CartesianIndex{2}[CartesianIndex(2, 1) CartesianIndex(3, 2) CartesianIndex(3, 3)])
The indices are CartesianIndex
es, which are essentially (row, col)
pairs. To obtain the row coordinates, you may use
julia> first.(Tuple.(inds))
1×3 Matrix{Int64}:
2 3 3
1 Like
@jishnub
Thanks for your help. I have another problem .How can I use LinearIndices
to get the index. In matlab, we can use sub2ind
.The matlab code is below.
>> A = [1 2 1; 2 2 1]
A =
1 2 1
2 2 1
>> inds = sub2ind([2,2], A(1,:), A(2,:))
inds =
3 4 1
The way to do this is to create a list of indices as CartesianIndex(rowind, colind)
pairs. In this case, we may broadcast CartesianIndices
over a list of row and column indices (Tuples, instead of creating a matrix as in Matlab).
julia> cartinds = CartesianIndex.((1,2,1), (2,2,1))
(CartesianIndex(1, 2), CartesianIndex(2, 2), CartesianIndex(1, 1)
After this, we create a list of all linear indices of a 2x2 matrix:
julia> lininds = LinearIndices((2,2))
2×2 LinearIndices{2, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}}:
1 3
2 4
Finally, we index into lininds
at the indices that we want.
julia> [lininds[i] for i in cartinds]
3-element Vector{Int64}:
3
4
1