JuliaPhysics / JuliaPhysics/Unitful.jl
`DimensionError` when computing `inv` of a StaticArray
- Dominant language
- Julia
- Stars
- 675
- Forks
- 124
- Avg merge
- 3h 38m
- Merged PRs (30d)
- 1
Description
Computing inverse of a `StaticArray` results in a `DimensionError`:
```julia
julia> using Unitful, StaticArrays, LinearAlgebra
julia> N = (@SMatrix [2 5; 1 3])u"Å"
2×2 SMatrix{2, 2, Quantity{Int64, 𝐋, Unitful.FreeUnits{(Å,), 𝐋, nothing}}, 4} with indices SOneTo(2)×SOneTo(2):
2 Å 5 Å
1 Å 3 Å
julia> inv(N)
ERROR: DimensionError: Å and 3.0 Å^-1 are not dimensionally compatible.
Stacktrace:
[1] convert(#unused#::Type{Quantity{Float64, 𝐋, Unitful.FreeUnits{(Å,), 𝐋, nothing}}}, x::Quantity{Float64, 𝐋^-1, Unitful.FreeUnits{(Å^-1,), 𝐋^-1, nothing}})
@ Unitful ~/.julia/packages/Unitful/SUQzL/src/conversion.jl:112
[2] macro expansion
@ ~/.julia/packages/StaticArrays/58yy1/src/util.jl:17 [inlined]
[3] convert_ntuple
@ ~/.julia/packages/StaticArrays/58yy1/src/util.jl:13 [inlined]
[4] SMatrix{2, 2, Quantity{Float64, 𝐋, Unitful.FreeUnits{(Å,), 𝐋, nothing}}, 4}(x::NTuple{4, Quantity{Float64, 𝐋^-1, Unitful.FreeUnits{(Å^-1,), 𝐋^-1, nothing}}})
@ StaticArrays ~/.julia/packages/StaticArrays/58yy1/src/SArray.jl:28
[5] _inv
@ ~/.julia/packages/StaticArrays/58yy1/src/inv.jl:15 [inlined]
[6] inv(A::SMatrix{2, 2, Quantity{Int64, 𝐋, Unitful.FreeUnits{(Å,), 𝐋, nothing}}, 4})
@ StaticArrays ~/.julia/packages/StaticArrays/58yy1/src/inv.jl:5
[7] top-level scope
@ REPL[13]:1
```
This doesn't occur if I am using normal arrays:
```julia
julia> M = [2 5; 1 3]u"Å"
2×2 Matrix{Quantity{Int64, 𝐋, Unitful.FreeUnits{(Å,), 𝐋, nothing}}}:
2 Å 5 Å
1 Å 3 Å
julia> inv(M)
2×2 reinterpret(Quantity{Float64, 𝐋^-1, Unitful.FreeUnits{(Å^-1,), 𝐋^-1, nothing}}, ::Matrix{Float64}):
3.0 Å^-1 -5.0 Å^-1
-1.0 Å^-1 2.0 Å^-1
```
Contributor guide
No contributing guide indexed for this repository
Research direction
Reproduce the failure with the Unitful and StaticArrays example, then compare it with the normal Matrix result. Start at the StaticArrays inv.jl path and the Unitful conversion.jl path shown in the stack trace; done means inv(N) succeeds and returns the expected inverse quantities with inverse units.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- julia
- Domain
- data
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100