Dimensionless quantities

I must admit that I don't think this problem is really new. However, I haven't found a post dealing exactly with this aspect of the issue.

I am doing calculation using Quantities, but I have problems dealing with dimensionless quantities. Suppose you define:

h = Quantity[b, "m"]

Now I would like to multiply h by a dimensionless parameter a, so to obtain the equivalent of the expression:

Quantity[a b, "m"]

Simply multiplying by a doesn't work (as you can check by trying to evaluate QuantitymMagnitude[a h]); this is understandable, since a is just an undefined symbol and as such has "unknown" units. I though, however, that multiplying by Quantity[a,"DimensionlessUnit"] would do the trick. Nope (same check).

The only solution I have found is to use

Quantity[a QuantityMagnitude[h], QuantityUnit[h]]

Rather involved... any idea or consideration in regard to this? Is there a profound reason I am not seeing for not supporting dimensionless symbols?

• – george2079 Feb 25 '15 at 0:20
• You are right, that post is related (and maybe I should have mentioned it explicitly). However, the answer does not address my problem (it only deals with the output). – Giacomo Ciani Feb 25 '15 at 1:10
• @GiacomoCiani I don't see a problem with Quantity[a, "DimensionlessUnit"]*h, since applying QuantityMagnitude gives a b m, the same as one gets with QuantityMagnitude[Quantity[a QuantityMagnitude[h], QuantityUnit[h]]]. The only difference is that applying QuantityUnit gives "DimensionlessUnit" "Meters", instead of just "Meters", but that can be reduced to 1 "m" by applying UnitConvert. So what am I missing? – theorist Feb 12 '17 at 20:38

You could try something like the following:

(A) Create a replacement Rule:

rule=a_*b_Quantity:>  MapAt[#*a&,b,1]

and then apply this rule:

a*Quantity[b, "Meters"] /. rule
(* Quantity[a b, "Meters"] *)

or (B) live more dangerously and Unprotect Quantity. After this you can use TagSetDelayed:

Unprotect[Quantity];
Quantity /: Times[a : Except[_Quantity], b_Quantity] := MapAt[#*a &, b, 1]

and now you don't need the rule anymore.

(1/c) Quantity[b, "Volts"]
(* Quantity[b/c, "Volts"] *)

What are the risks of Unprotecting Quantity? I am not sure, but if you start getting strange results/errors after doing this you likely know the culprit.

• This works! Actually, I have a rather complicated expression and I had to modify the rule in a_Symbol*b_Quantity:> MapAt[#*a&,b,1], or it would mess up the result. I haven't figured out why yet (on simple examples your rule seem to work even if a is a Quantity). – Giacomo Ciani Feb 26 '15 at 15:32