Remove units from sparse matrix

I have a sparse array of Quantities with Units from Unitful.jl .
I would like to use the conjugate gradient method (cg) from IterativeSolvers.jl on it. However that is only defined for reals. And AbstractQuantity is not a subtype of real.
How do I best resolve this?
Can I for example make AbstractQuantity real? Can I somehow ignore the units? Is there a better solution (because not all Quantities are real, obviously)?

I think this is called unit stripping. I’m not sure that it’s the preferred way of doing things, but at least it should work. Here is a made up example:

using Unitful

Ξ±  = 1u"m^2/s"
dx = 1u"mm"

A = Ξ±/dx^2 * [2 1 0;
              1 2 1;
              0 1 2]

S = ones(3) * u"K/s"

A_stripped = ustrip.(u"s^(-1)", A)    # Careful to pick
S_stripped = ustrip.(u"K/s",    S)    # compatible units
T_stripped = A_stripped \ S_stripped  # in this part where
T = T_stripped * u"K"                 # we manipulate plain Floats

@assert A * T β‰ˆ S
1 Like

Thanks a lot.
ustrip is exactly what I need. It also works on sparse matricies, for example:

using Unitful
using SparseArrays
using IterativeSolvers
v = [1.,2.]u"cm"
A = spdiagm(v)
ustrip(A)

note that there is no β€œ.”, so it does not apply a for loop on every element of the potentially large sparse matrix, but does it in a smart fashion by applying strip to the underlying vectors.