Hi Matt,
Thanks for the tips. The 1st example is quite neat and compact (similar to
sub & fill!). the for loop is obviously a good option too.
Best Regards,
Jan
Dňa utorok, 3. novembra 2015 15:59:37 UTC+1 Matt Bauman napísal(-a):
>
> The ability to assign a single element into multiple locations like this
> is called scalar broadcasting. When you have an array of arrays, however,
> each element isn't a scalar. So it's trying to assign the elements of the
> right side (Float64s) to the elements of the right side (matrices). You
> can work around this several ways:
>
> Wrap the right had side in an array of the appropriate size. Note that,
> like using sub and fill! above, this puts exactly the same matrix (with
> shared data) in all four locations:
>
> julia> z[2:5] = fill(rand(2,2), 4); z
> 10-element Array{Array{Float64,2},1}:
> #undef
> [0.144618,0.285725,0.415011,0.232808]
> [0.144618,0.285725,0.415011,0.232808]
> [0.144618,0.285725,0.415011,0.232808]
> [0.144618,0.285725,0.415011,0.232808]
> #undef
> #undef
> #undef
> #undef
> #undef
>
> Alternatively, the best solution is probably to use a for loop. This
> probably has the semantics that you want, with different uncoupled arrays
> in each spot, and it'll be fast, too:
>
> julia> for idx = 2:5
> z[idx] = rand(2,2)
> end
> z
> 10-element Array{Array{Float64,2},1}:
> #undef
> [0.691373,0.130612,0.837506,0.255362]
> [0.471128,0.492608,0.602753,0.119473]
> [0.133986,0.793537,0.800129,0.433915]
> [0.922652,0.645796,0.997629,0.982244]
> #undef
> #undef
> #undef
> #undef
> #undef
>
> Matt
>
> On Tuesday, November 3, 2015 at 9:26:49 AM UTC-5, Ján Dolinský wrote:
>>
>> Hi guys,
>>
>> I came across a problem of setting up a (general) subarray with an object
>> (value which is not an ordinary number) e.g.
>>
>> julia> z = Array(Matrix{Float64}, 10)
>> 10-element Array{Array{Float64,2},1}:
>> #undef
>> #undef
>> #undef
>> #undef
>> #undef
>> #undef
>> #undef
>> #undef
>> #undef
>> #undef
>>
>> julia> z[2:5] = rand(2,2)
>> ERROR: MethodError: `convert` has no method matching convert(::Type{Array
>> {Float64,2}}, ::Float64)
>> This may have arisen from a call to the constructor Array{Float64,2
>> }(...),
>> since type constructors fall back to convert methods.
>> Closest candidates are:
>> call{T}(::Type{T}, ::Any)
>> convert{T,S,N}(::Type{Array{T,N}}, ::SubArray{S,N,P<:AbstractArray{T,N
>> },I<:Tuple{Vararg{Union{AbstractArray{T,1},Colon,Int64}}},LD})
>> convert{T,n}(::Type{Array{T,n}}, ::Array{T,n})
>> ...
>> in setindex! at array.jl:339
>>
>> What is a "correct" way of doing this ? I can do it via "sub" and
>> "fill!" e.g.
>>
>> julia> zz = sub(z, 2:5)
>> 4-element SubArray{Array{Float64,2},1,Array{Array{Float64,2},1},Tuple{
>> UnitRange{Int64}},1}:
>> #undef
>> #undef
>> #undef
>> #undef
>>
>> julia> fill!(zz, rand(2,2))
>> 4-element SubArray{Array{Float64,2},1,Array{Array{Float64,2},1},Tuple{
>> UnitRange{Int64}},1}:
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>>
>> julia> z
>> 10-element Array{Array{Float64,2},1}:
>> #undef
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>> 2x2 Array{Float64,2}:
>> 0.313155 0.553893
>> 0.74854 0.997401
>> #undef
>> #undef
>> #undef
>> #undef
>> #undef
>>
>> Thanks,
>> Jan
>>
>