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.
>