Jlee523
Jlee523

Reputation: 147

Changing a value in a Julia array and getting a strange result?

I have the following code in Julia 1.4.2

temp = zeros(Int64, length(input_string))
i = 1

while i< length(input_string)
   temp[i] = input_string[i]
   i += 1
end

Using input_string = "200" I would expect this to return temp = [2 0 0], but for some reason I return a 3 element Array{Int64,1} with values [50, 48, 0].

Is there a way for me to understand this?

Upvotes: 4

Views: 82

Answers (2)

Przemyslaw Szufel
Przemyslaw Szufel

Reputation: 42194

When converting "200" to an Int vector [2, 0, 0] much shorter form is just:

parse.(Int,split("200",""))

or a 4x faster version

parse.(Int,(v for v in "200"))

and another 10% better:

parse.(Int,collect("200"))

Finally, the fastest I could think of:

[Int(v)-48 for v in "200"]

Upvotes: 2

fredrikekre
fredrikekre

Reputation: 10984

There are several things to this:

  1. Indexing a string (input_string[i]) gives you a character with type Char.
  2. When updating the content of an array (temp[i] = ...) Julia converts the right hand side to the same element type as the array temp.
  3. Converting a Char (right hand side) to an Int (which is the element type of temp) gives the ASCII value corresponding to the character.

The string "200" consists of the characters '2', '0' and '0', which ASCII values are 50, 48 and 48 so we would expect temp to be [50, 48, 48] BUT the loop has a bug since it should check for i <= length(input_string), so the last element beeing 0 is there from the initialization.


Here is the code I would have written for this:

function str_to_ints(str)
    r = Int[]
    for c in str
        ci = parse(Int, c)
        push!(r, ci)
    end
    return r
end

Example:

julia> str_to_ints("200")
3-element Array{Int64,1}:
 2
 0
 0

Upvotes: 5

Related Questions