Jonas
Jonas

Reputation: 1529

let indexing return a matrix instead of a vector in julia

When you index a matrix in Julia, and your selection is a single column or row the result will be represented as a vector. similarly, when you index a single point you get the value of that point, not a 1x1 matrix.

However, for my use case I want my answer to be a matrix as well, because the orientation of the vector has meaning, that I don't want to lose.

So given the following example matrix:

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

I get:

julia> A[:, 1]
2-element Vector{Int64}:
 1
 3

julia> A[1, :]
2-element Vector{Int64}:
 1
 2

julia> A[1, 1]
 1

but I want:

julia> A[:, 1]
2×1 Matrix{Int64}:
 1
 3

julia> A[1, :]
1×2 Matrix{Int64}:
 1 2

julia> A[1, 1]
1×1 Matrix{Int64}:
 1

Is there an easy way to achieve this?

Right now I do something like:

function getindex_asmatrix(A::Matrix, i, j)
    # If i & j are Integers convert point to 1x1 Matrix
    # If only j == Integer make a nx1 Matrix
    # If only i == Integer make a 1xm Matrix
    # else do A[i, j]
end

But I feel there might be an more elegant solution.

Upvotes: 8

Views: 411

Answers (1)

Bogumił Kamiński
Bogumił Kamiński

Reputation: 69869

Just use 1:1 (range) instead of 1, e.g.:

julia> A[:, 1:1]
2×1 Matrix{Int64}:
 1
 3

julia> A[1:1, :]
1×2 Matrix{Int64}:
 1  2

julia> A[1:1, 1:1]
1×1 Matrix{Int64}:
 1

You could also use [1] instead, but it will allocate, while 1:1 does not allocate.

Upvotes: 15

Related Questions