Index a matrix with two separate row and column index vectors

I have a matrix A and a row index vector R and a column index vector C.
I want to get a vector from A as [A[R[1], C[1]], A[R[2], C[2]], ...].
For instance, with R=[2, 4], C=[3, 1], I want [A[2, 3], A[4, 1]].
Is there any built-in mechanism for this kind of indexing? A[R, C] will not work.

You may broadcast getindex as getindex.(Ref(A), rowinds, colinds)

5 Likes

In this specific case, I recommend the getindex broadcast suggested above. In a more general or complicated situation, consider using the CartesianIndex type. For example,

julia> R = [2, 4]; C = [3, 1]; A = [10i+j for i in 1:4, j in 1:4]
4×4 Matrix{Int64}:
 11  12  13  14
 21  22  23  24
 31  32  33  34
 41  42  43  44

julia> CartesianIndex.(R, C)
2-element Vector{CartesianIndex{2}}:
 CartesianIndex(2, 3)
 CartesianIndex(4, 1)

julia> A[CartesianIndex.(R, C)]
2-element Vector{Int64}:
 23
 41
5 Likes

Not a recommendation, just a different view angle using LinearAlgebra.jl:

diag(view(A, R, C)) 

With TensorCast.jl, we can take a non-allocating view along the diagonal:

using TensorCast
@cast v[i] := view(A, R, C)[i,i]  

this view is equivalent to writing:

V = view(A, R, C)
view(V, diagind(V))
r,c=size(A)
@. A[(C-1)*r+R]
1 Like