I just started working with Mathematica and am toying with pattern matching. There may be something obvious I'm missing in this, but I can't figure it out by myself.
I want to write down a function that takes a complex number as arguments. So f[1 + 2 I]
should be a valid input, as well as f[a + b I]
. I want, however, to make my function parse this as two numbers of the form a + bi
, getting a
and b
by pattern matching. I made several attempts similar to this:
f[a_ + b_ I] := NSolve[a^2 + b^2 == 1/2 (1 + z), z]
SetAttributes[f, HoldAll]
(I guess the NSolve doesn't matter in this case, but let it there in case it's part of the issue.)
This doesn't work as I planned. Any attempt to call it, like f[1 + 2 I]
, just echoes itself, but it does work fine when I call it with symbolic arguments, such as f[a + b I]
.
I guessed this should be due to some difference in the internal representation of symbolic expressions and complex numbers. Indeed, whenever I try to MatchQ[m + n I, a_ + b_ I]
, it says it's True. But when I try the sorts of MatchQ[Unevaluated[2 + 3 I], a_ + b_ I]
, it's False.
In trying to figure it out, I asked
FullForm[a + b I]
FullForm[Unevaluated[2 + 3 I]]
FullForm[a_ + b_ I]
and got
Plus[a,Times[Complex[0,1],b]]
Unevaluated[Plus[2,Times[3,\[ImaginaryI]]]]
Plus[Pattern[a,Blank[]],Times[Complex[0,1],Pattern[b,Blank[]]]]
My questions are:
- Shouldn't the
Plus[2,Times[3,\[ImaginaryI]]]
match withPlus[Pattern[a,Blank[]],Times[Complex[0,1],Pattern[b,Blank[]]]]
? - What is the difference between
\[ImaginaryI]
andComplex[0,1]
? I know the first is a symbol as much as\[Alpha]
is, and I guess me asking for Unevaluated is preventing it from being cast as aComplex[0,1]
. Probably this would be needed for the matching, but I don't know a workaround. - Is there a better way to do what I'm attempting with my function?
Thanks!
Re
andIm
to get the two parts? $\endgroup$