On Tue, Jul 28, 2015 at 10:05 AM, Matt Bauman <[email protected]> wrote:
> Yes, this is one of the ever-tricky cases of "did you mean the container or
> the elements of that container?"  Setindex always assumes that, if the RHS
> of the assignment is an array of some sort, it's the elements that should be
> assigned.
>
> David, `A[:] = Vector[[1,2,3]]` works as you'd expect (this is the array
> concatenation vs construction issue), but this will only work if
> `length(A)==1`.
>
> And Linus, an easy work-around (assuming that you don't always just have a
> one-element) is to use `fill!` instead: `fill!(A, [1,2,3])`.

Well, depend on what you want, make sure you don't hit another pitfall

```julia
julia> a = Vector{Vector{Int}}(2)
2-element Array{Array{Int64,1},1}:
#undef
#undef

julia> fill!(a, [1, 2, 3])
2-element Array{Array{Int64,1},1}:
[1,2,3]
[1,2,3]

julia> push!(a[1], 4)
4-element Array{Int64,1}:
1
2
3
4

julia> a[2]
4-element Array{Int64,1}:
1
2
3
4
```

>
>
> On Tuesday, July 28, 2015 at 8:45:44 AM UTC-4, David Gold wrote:
>>
>> That error makes sense to me, insofar as `A[:]` is not a scalar entry but
>> a whole vector. So assigning the vector `[1, 2, 3]` to `A[:]` is interpreted
>> as, "put all the things from this vector into that vector". But by that
>> logic, `A[:] = [[1, 2, 3],]` ought to work, and it doesn't. Of course,
>> scalar assignment works as expected.
>>
>> If you can't avoid colon, one thing you can do is define a wrapper type
>> that isn't interpreted as container of objects each of which is to be
>> assigned to an index in `A[:]`, as well as an appropriate convert method:
>>
>> julia> type ArrayWrapper{T, N}
>>     A::Array{T, N}
>> end
>>
>> julia> Base.convert{T, N}(::Type{Array{T, N}}, X::ArrayWrapper{T, N}) =
>> X.A
>> convert (generic function with 700 methods)
>>
>> julia> A[:] = ArrayWrapper([1, 2, 3])
>> ArrayWrapper{Int64,1}([1,2,3])
>>
>> julia> A
>> 1-element Array{Array{Int64,1},1}:
>> [1,2,3]
>>
>>
>> On Tuesday, July 28, 2015 at 4:06:59 AM UTC-4, Linus Härenstam-Nielsen
>> wrote:
>>>
>>> I'm implementing a setindex! method for an object with a field of type
>>> Matrix{Vector{Float64}} (a matrix of vectors) and I've run into a problem
>>> with getting the Colon() index to work properly. It comes down to this:
>>>
>>> julia> A = Array(Vector{Int}, 1)
>>> 1-element Array{Array{Int64,1},1}:
>>>  #undef
>>>
>>> julia> A[:] = [1,2,3]
>>> ERROR: DimensionMismatch("tried to assign 3 elements to 1 destinations")
>>>  in throw_setindex_mismatch at operators.jl:226
>>>
>>> Since the element I'm trying to assign is a vector setindex! calls the
>>> wrong method for my purposes. What I would like is for the resulting array
>>> to be:
>>>
>>> julia> A
>>> 1-element Array{Array{Int64,1},1}:
>>>  [1,2,3]
>>>
>>> Is there a way to get around this? I would change the datatype to
>>> Array{Float64, 3} if I could but other functions rely on the current
>>> structure.

Reply via email to