Hello everyone!
I am new to Julia and I want to create single-entry matrices i.e.,
1.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 1.0
Can please anyone shed some light on this? I tried using the following code
matrix1 = zeros(3, 3)
matrix1[1, 1] = 1.0
matrix1
matrix2 = zeros(3, 3)
matrix2[1, 1] = 1.0
matrix2
matrix3 = zeros(3, 3)
matrix3[1, 1] = 1.0
matrix3
But I want to do it in a more elegant and sleek way.
IMO thereβs nothing wrong with the way you wrote it, but maybe you prefer something like the following:
one_hot(rows, cols, i, j) = [(r, c) == (i, j) for r in 1:rows, c in 1:cols]
matrix1 = one_hot(3, 3, 1, 1)
matrix2 = one_hot(3, 3, 2, 2)
matrix3 = one_hot(3, 3, 3, 3)
3 Likes
Maybe a sparse array if there is only going to be one value?
using SparseArrays
julia> A = dropzeros!(sparse([1,3], [2,3], [1.0,0.0]))
3Γ3 SparseMatrixCSC{Float64, Int64} with 1 stored entry:
β
1.0 β
β
β
β
β
β
β
2 Likes
FillArrays
has a OneElement
type that provides a non-materialized implementation:
julia> OneElement(1 #= value =#, (2,2) #= index =#, (3,3) #= size =#)
3Γ3 OneElement{Int64, 2, Tuple{Int64, Int64}, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}}:
β
β
β
β
1 β
β
β
β
If you want a matrix from this, you may convert it:
julia> A = OneElement(1, (2,2), (3,3));
julia> Matrix(A)
3Γ3 Matrix{Int64}:
0 0 0
0 1 0
0 0 0
6 Likes
Just based on this approach:
julia> matrix2 = CartesianIndices((3, 3)) .== CartesianIndex(2, 2)
3Γ3 BitMatrix:
0 0 0
0 1 0
0 0 0
Cartesian indices are nice, just a bit verbose (due to the long names).
4 Likes