# Similar identity matrix

**URL:** <https://discourse.julialang.org/t/similar-identity-matrix/14695>\
**Category:** General Usage\
**Created:** [September 8, 2018, 7:10am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695 "2018-09-08T07:10:47Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![mschauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mschauer/32/13946_2.png) [@mschauer](https://discourse.julialang.org/u/mschauer)\
**Post date:** [September 8, 2018, 7:10am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/1 "2018-09-08T07:10:47Z")

</div>

What is the idiomatic way to construct a full _m×m_ or _n×n_ identity matrix _similar_ to a given _m×n_ matrix _A_ (static or not)?

`one(A*A')` or `one(A'*A)` does the trick but is of course not what I want.

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [September 8, 2018, 7:19am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/2 "2018-09-08T07:19:06Z")

</div>

Do you really need one? Can’t you just sidestep the question with `LinearAlgebra.I`?

---

<div class="post-metadata">

**Author:** ![mschauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mschauer/32/13946_2.png) [@mschauer](https://discourse.julialang.org/u/mschauer)\
**Post date:** [September 8, 2018, 7:33am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/3 "2018-09-08T07:33:56Z")

</div>

Yes, it is the initial value of a matrix-valued ODE and should be of the same type as later values.

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [September 8, 2018, 7:41am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/4 "2018-09-08T07:41:04Z")

</div>

One way is

```julia
julia> using LinearAlgebra

julia> A = rand(4,5);

julia> diagm(0=>fill(1., size(A,1)))
4×4 Array{Float64,2}:
 1.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0
 0.0 0.0 1.0 0.0
 0.0 0.0 0.0 1.0

julia> diagm(0=>fill(1., size(A,2)))
5×5 Array{Float64,2}:
 1.0 0.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0 0.0
 0.0 0.0 1.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0
 0.0 0.0 0.0 0.0 1.0

```

or even `diagm(0=>fill(one(eltype(A)), size(A,1)))`.

Note that in Julia 0.6 you could do

```julia
julia> eye(size(A,1))
4×4 Array{Float64,2}:
 1.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0
 0.0 0.0 1.0 0.0
 0.0 0.0 0.0 1.0

julia> eye(size(A,2))
5×5 Array{Float64,2}:
 1.0 0.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0 0.0
 0.0 0.0 1.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0
 0.0 0.0 0.0 0.0 1.0

```

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [September 8, 2018, 7:50am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/5 "2018-09-08T07:50:46Z")

</div>

Another way would be `Matrix(one(eltype(A))I, size(A,1), size(A,1))` I guess.

---

<div class="post-metadata">

**Author:** ![mschauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mschauer/32/13946_2.png) [@mschauer](https://discourse.julialang.org/u/mschauer)\
**Post date:** [September 8, 2018, 7:52am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/6 "2018-09-08T07:52:49Z")

</div>

Thank you, that’s it (almost)!

```julia
julia> A
5×4 Array{Float64,2}:
 0.896177 0.0597406 0.611605 0.231433
 0.119473 0.998269 0.0299731 0.947813
 0.0465002 0.431471 0.321885 0.20422 
 0.641878 0.0221313 0.0604966 0.517904
 0.958566 0.675325 0.0570553 0.603291

julia> typeof(A)(one(eltype(A))I, size(A,1), size(A,1))
5×5 Array{Float64,2}:
 1.0 0.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0 0.0
 0.0 0.0 1.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0
 0.0 0.0 0.0 0.0 1.0

```

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [September 8, 2018, 7:54am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/7 "2018-09-08T07:54:05Z")

</div>

Oh, I see.

---

<div class="post-metadata">

**Author:** ![mschauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mschauer/32/13946_2.png) [@mschauer](https://discourse.julialang.org/u/mschauer)\
**Post date:** [September 8, 2018, 7:59am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/8 "2018-09-08T07:59:58Z")

</div>

For static arrays it is unfortunately slightly different

```julia
julia> similar_type(B, Size(size(B,1),size(B,1)))(I)
5×5 SArray{Tuple{5,5},Float64,2,25}:
 1.0 0.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0 0.0
 0.0 0.0 1.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0
 0.0 0.0 0.0 0.0 1.0

```

---

<div class="post-metadata">

**Author:** ![fredrikekre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fredrikekre/32/1688_2.png) [@fredrikekre](https://discourse.julialang.org/u/fredrikekre)\
**Post date:** [September 8, 2018, 8:12am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/9 "2018-09-08T08:12:22Z")

</div>

```julia
julia> using LinearAlgebra

julia> A = rand(5,4);

julia> copyto!(similar(A, size(A,1), size(A,1)), I)
5×5 Array{Float64,2}:
 1.0 0.0 0.0 0.0 0.0
 0.0 1.0 0.0 0.0 0.0
 0.0 0.0 1.0 0.0 0.0
 0.0 0.0 0.0 1.0 0.0
 0.0 0.0 0.0 0.0 1.0

```

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [September 8, 2018, 8:36am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/10 "2018-09-08T08:36:29Z")

</div>

I don’t think this works for static matrixes:

```julia
julia> using LinearAlgebra, StaticArrays
julia> A = @SMatrix rand(5,4);
julia> typeof(copyto!(similar(A, size(A,1), size(A,1)), I))
Array{Float64,2}

```

because the generic `copyto!` is used.

This is could be a bug in `StaticArrays`, but at the same time I suspect that the design of the library which needs this could be improved, well-designed Julia code should either not require tricks like this, or provide helper functions for it.

---

<div class="post-metadata">

**Author:** ![mschauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mschauer/32/13946_2.png) [@mschauer](https://discourse.julialang.org/u/mschauer)\
**Post date:** [September 8, 2018, 9:01am UTC](https://discourse.julialang.org/t/similar-identity-matrix/14695/11 "2018-09-08T09:01:41Z")

</div>

For this use-case it would be nice provide a second argument like `Val(:Left)` to `one` which allows to specify to take the left or a right multiplicative unit if they are not equal.
