Skip to content

Commit 850e1e9

Browse files
committed
feat: two-arg ustrip
1 parent d369989 commit 850e1e9

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

src/arrays.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ end
125125

126126
@inline ustrip(A::QuantityArray) = A.value
127127
@inline ustrip(A::AbstractArray{<:UnionAbstractQuantity}) = ustrip.(A)
128+
@inline function ustrip(unit::UnionAbstractQuantity, q::QuantityArray)
129+
dimension(unit) == dimension(q) || throw(DimensionError(unit, q))
130+
conversion_factor = ustrip(dimension(q) / unit)
131+
return ustrip(q) .* conversion_factor
132+
end
128133
@inline dimension(A::QuantityArray) = A.dimensions
129134

130135
array_type(::Type{<:QuantityArray{T,N,D,Q,V}}) where {T,N,D,Q,V} = V

src/utils.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,36 @@ Remove the units from a quantity.
388388
ustrip(::AbstractDimensions) = error("Cannot remove units from an `AbstractDimensions` object.")
389389
@inline ustrip(q) = q
390390

391+
"""
392+
ustrip(unit::UnionAbstractQuantity, q::UnionAbstractQuantity)
393+
ustrip(unit::UnionAbstractQuantity, q::AbstractArray{<:UnionAbstractQuantity})
394+
395+
Convert quantity `q` to the units specified by `unit`, then strip the units.
396+
This is equivalent to `ustrip(q / unit)`, but also verifies the dimensions are compatible.
397+
398+
# Examples
399+
```julia
400+
julia> ustrip(u"km", 1000u"m")
401+
1.0
402+
403+
julia> ustrip(u"s", 1u"minute")
404+
60.0
405+
406+
julia> ustrip(u"km", [1000u"m", 2000u"m"])
407+
2-element Vector{Float64}:
408+
1.0
409+
2.0
410+
```
411+
"""
412+
@inline function ustrip(unit::UnionAbstractQuantity, q::UnionAbstractQuantity)
413+
dimension(unit) == dimension(q) || throw(DimensionError(unit, q))
414+
return ustrip(q / unit)
415+
end
416+
@inline function ustrip(unit::UnionAbstractQuantity, q::AbstractArray{<:UnionAbstractQuantity})
417+
all(qi -> dimension(qi) == dimension(unit), q) || throw(DimensionError(unit, q))
418+
return @. ustrip(q / unit)
419+
end
420+
391421
"""
392422
dimension(q::AbstractQuantity)
393423
dimension(q::AbstractGenericQuantity)

0 commit comments

Comments
 (0)