Hi Sheehan,

The inbounds macro just sets a flag around the block, which works fine here
- see the output of `macroexpand( :(@inbounds ...) )`. Unfortunately it
looks like the flag is as-yet unsupported at the compiler level for
non-native arrays. See:

https://github.com/JuliaLang/julia/issues/7799
https://github.com/JuliaLang/julia/issues/9077

Cheers,
Isaiah

On Tue, Dec 23, 2014 at 5:38 PM, Sheehan Olver <[email protected]>
wrote:

> I'm making a custom "BandedMatrix" data type that overrides setindex!, and
> I want to use @inbounds:
>
> @inbounds A[k,j]=4
>
>
> The issue is that @inbounds doesn't seem to go "inside" the setindex!
> call.  Any idea to allow @inbounds to work?  My solution is to add another
> call ibsetindex!, but this makes the set syntax uglier.  Code is below.
>
>
>
>
> immutable BandedMatrix{T}
>     data::Matrix{T}
>     a::Int
>     b::Int
>     n::Int #Number of rows
> end
> function BandedMatrix{T}(data::Matrix{T},a,b,n)
>     @assert size(data,1)==b-a+1
>     BandedMatrix{data,a,b,n}
> end
>
>
> bazeros{T}(::Type{T},a::Integer,b,n,m)=BandedMatrix(zeros(T,b-a+1,m),a,b,n)
> bazeros{T}(::Type{T},a::Integer,b,n)=bazeros(T,a,b,n,n)
> bazeros(a::Integer,b,n,m)=bazeros(Float64,a,b,n,m)
> bazeros(a::Integer,b,n)=bazeros(Float64,a,b,n,n)
>
> Base.size(A::BandedMatrix,k)=ifelse(k==1,A.n,size(A.data,2))
> Base.size(A::BandedMatrix)=A.n,size(A.data,2)
>
> usgetindex(A::BandedMatrix,k,j::Integer)=A.data[k-j+A.b+1,j]
>
> getindex{T}(A::BandedMatrix{T},k::Integer,j::Integer)=(A.a≤j-k≤A.b)?usgetindex(A,k,j):(k≤A.n?zero(T):throw(BoundsError()))
> getindex(A::BandedMatrix,kr::Range,j::Integer)=A.a≤j-kr[end]≤j-kr[1]≤A.b?usgetindex(A,kr,j):[A[k,j]
> for k=kr]
> getindex(A::BandedMatrix,k::Integer,jr::Range)=[A[k,j] for j=jr]
> getindex(A::BandedMatrix,kr::Range,jr::Range)=[A[k,j] for k=kr,j=jr]
> Base.full(A::BandedMatrix)=A[1:size(A,1),1:size(A,2)]
>
>
> ibsetindex!(A::BandedMatrix,v,k,j::Integer)=(@inbounds
> A.data[k-j+A.b+1,j]=v)
> setindex!(A::BandedMatrix,v,k,j::Integer)=(A.data[k-j+A.b+1,j]=v)
>
> function setindex!(A::BandedMatrix,v,kr::Range,jr::Range)
>     for j in jr
>         A[kr,j]=slice(v,:,j)
>     end
> end
> function setindex!(A::BandedMatrix,v,k::Integer,jr::Range)
>     for j in jr
>         A[k,j]=v[j]
>     end
> end
>
>
>

Reply via email to