Thanks Tim,

Following the link you suggested I made the following type which does what 
I want:

immutable MyType{T,N,A<:AbstractArray} <: AbstractArray{Float64,3}
    conf_lims :: A
end
MyType{T,N}(conf_lims::AbstractArray{T,N}) = MyType{T,N,typeof(conf_lims)}(
conf_lims)
Base.size(S::MyType) = (S.count,)
Base.linearindexing(::Type{MyType}) = Base.LinearFast();


What I haven't figured out is how to add more than just the one variable; 
for instance I'd like to have a "count" variable which would be an integer?




On Monday, November 16, 2015 at 3:45:43 PM UTC+1, Tim Holy wrote:
>
> Totally different error (it's a missing size method). You also need to 
> read 
> this: 
> http://docs.julialang.org/en/stable/manual/interfaces/#abstract-arrays 
>
> --Tim 
>
> On Monday, November 16, 2015 06:08:15 AM Evan wrote: 
> > Thank you, Tim, I understand the motivation for the approach in the link 
> > you sent. 
> > 
> > I'm still unable to create the type that I want. I actually want two 
> arrays 
> > in my type, one 2d and the other 3d. 
> > 
> > First though, I'm still stuck on just the 2d when I try to implement 
> your 
> > suggestion: 
> > julia> type MyType{T,N,A<:AbstractArray} <: AbstractArray{T,N} 
> >            var::A 
> >        end 
> > 
> > julia> MyType{T,N}(var::AbstractArray{T,N}) = 
> MyType{T,N,typeof(var)}(var) 
> > MyType{T,N,A<:AbstractArray{T,N}} 
> > 
> > julia> aa = MyType(zeros(2,3)) 
> > Error showing value of type MyType{Float64,2,Array{Float64,2}}: 
> > ERROR: MethodError: `size` has no method matching 
> size(::MyType{Float64,2, 
> > Array{Float64,2}}) 
> > Closest candidates are: 
> >   size{T,n}(::AbstractArray{T,n}, ::Any) 
> >   size(::Any, ::Integer, ::Integer, ::Integer...) 
> >  in showarray at show.jl:1231 
> >  in anonymous at replutil.jl:29 
> >  in with_output_limit at ./show.jl:1271 
> >  in writemime at replutil.jl:28 
> >  in display at REPL.jl:114 
> >  in display at REPL.jl:117 
> >  [inlined code] from multimedia.jl:151 
> >  in display at multimedia.jl:162 
> >  in print_response at REPL.jl:134 
> >  in print_response at REPL.jl:121 
> >  in anonymous at REPL.jl:624 
> >  in run_interface at ./LineEdit.jl:1610 
> >  in run_frontend at ./REPL.jl:863 
> >  in run_repl at ./REPL.jl:167 
> >  in _start at ./client.jl:420 
> > 
> > julia> 
> > 
> > Performance is important, but it's not clear what I should use in place 
> of 
> > abstract types; I've tried replacing AbstractArray with just Array but 
> that 
> > does not appear to work. 
> > 
> > On Monday, November 16, 2015 at 1:03:05 PM UTC+1, Tim Holy wrote: 
> > > This fixes two problems: 
> > > 
> > > type MyType{T,N,A<:AbstractArray} <: AbstractArray{T,N} 
> > > 
> > >     var::A 
> > > 
> > > end 
> > > 
> > > MyType{T,N}(var::AbstractArray{T,N}) = MyType{T,N,typeof(var)}(var) 
> > > 
> > > 
> > > 
> > > If performance matters, you should not use abstract types for fields. 
> See 
> > > 
> > > 
> http://docs.julialang.org/en/stable/manual/faq/#how-do-abstract-or-ambiguo 
> > > us-fields-in-types-interact-with-the-compiler and the section after 
> that. 
> > > 
> > > --Tim 
> > > 
> > > On Monday, November 16, 2015 03:54:15 AM Evan wrote: 
> > > > For a 2d array the following works: 
> > > > 
> > > > type mytype{T} 
> > > > 
> > > >     var :: AbstractMatrix{T} 
> > > > 
> > > > end 
> > > > 
> > > > julia> t = mytype(zeros(4, 3)) 
> > > > 
> > > > mytype{Float64}(4x3 Array{Float64,2}: 
> > > >  0.0  0.0  0.0 
> > > >  0.0  0.0  0.0 
> > > >  0.0  0.0  0.0 
> > > >  0.0  0.0  0.0) 
> > > > 
> > > > But how do I extend this to a 3d array? 
> > > > 
> > > > julia> t = mytype(zeros(2, 4, 3)) 
> > > > ERROR: MethodError: `convert` has no method matching 
> > > 
> > > convert(::Type{mytype{T 
> > > 
> > > > }}, ::Array{Float64,3}) 
> > > > This may have arisen from a call to the constructor mytype{T}(...), 
> > > > since type constructors fall back to convert methods. 
> > > > 
> > > > Closest candidates are: 
> > > >   call{T}(::Type{T}, ::Any) 
> > > >   convert{T}(::Type{T}, ::T) 
> > > >   mytype{T}(::AbstractArray{T,2}) 
> > > >   
> > > >  in call at essentials.jl:56 
>
>

Reply via email to