I have an Array{T,N+1} and I want to pass a slice/view of the first N dimensions to a function. If I knew, say, N=2 I would do
b = @view a[:,:,1]
f(b,args...)
But the number of colons depends on N. Is there a way to do this for general N?
Or also selectdim(array,dim_to_select,indx_on_that_dim), e.g. b = selectdim(a,3,1)
4 Likes
I really like the solution with selectdim(), but I add this one too
vv = @view v[ntuple(_->:,ndims(v)-1)...,1]
2 Likes
Does this produce a “view” or copy to a new array?
A tupple of colons! Didn’t know you could do that!
As far as I understand (:) is a function, like isless() for example
It should be equivalent (alias?) of Colon().
But let’s wait for someone who knows to explain better how it works
Just try it :
julia> x = [1 2; 3 4]
2Ă—2 Matrix{Int64}:
1 2
3 4
julia> xd2_1 = selectdim(x,2,1)
2-element view(::Matrix{Int64}, :, 1) with eltype Int64:
1
3
julia> xd2_1[2] = 30
30
julia> x
2Ă—2 Matrix{Int64}:
1 2
30 4
1 Like
sijo
May 25, 2023, 7:02am
11
That’s right:
So Colon is a struct type and the singleton instance Colon() is a function and : is a synonym for that.
2 Likes
I don’t have Julia installed on my phone… yet!
This is the Base solution, so I’ll switch this to the answer. But b=@view a(..,i) from EllipsisNotation.jl is a really nice bit of syntactic sugar.
1 Like
Huh. The ellipsis version works fine on the GPU, but selectdim throws an allocation error:
ERROR: InvalidIRError: compiling MethodInstance for (::GPUArrays.var"#broadcast_kernel#28")(::CUDA.CuKernelContext, ::CuDeviceVector{SVector{3, Float32}, 1}, ::Base.Broadcast.Broadcasted{CUDA.CuArrayStyle{1}, Tuple{Base.OneTo{Int64}}, typeof(interp!), Tuple{Base.Broadcast.Extruded{CuDeviceVector{SVector{3, Float32}, 1}, Tuple{Bool}, Tuple{Int64}}, Base.Broadcast.Extruded{CuDeviceVector{SVector{3, Float32}, 1}, Tuple{Bool}, Tuple{Int64}}, CUDA.CuRefValue{CuDeviceArray{Float32, 4, 1}}}}, ::Int64) resulted in invalid LLVM IR
Reason: unsupported call through a literal pointer (call to ijl_alloc_array_1d)
@maleadt , Is there a reason why a view created by selectdim shouldn’t work within a kernel?
Not that I know; SubArrays of CuDeviceArrays should generally be supported. Please include the full backtrace, and make sure the code is type stable first.