Trying to answer a recent question I've come across a strange behavior with stem. Try this:
x = [1+j 2-j 3+j 4-j];
stem(x)
On my Matlab version (2010b) this plots the imaginary part of x, not the real part as I expected. On the contrary,
stem(1:length(x),x)
plots the real part of x, which is consistent with the behavior of plot(1:length(x),x).
Can you think of any reason why stem(x) plots the imaginary part of x instead of the real part? Specially when stem(1:length(x),x) does plot the real part. Or should we conclude it's a bug?
As far as I can tell, this is partially correct behavior. When you input an imaginary, the real and imaginary components are treated as x and y value pairs (i.e. in xychk.m, x = real(y); y = imag(y);). So this explains why the imaginary component is on the y-axis.
However, when you input x-axis values with a second argument, it gets the x-axis values from the first input argument and treats the real part of y as the y-axis data. Specifically, when stem(1:length(x),x) is called, stem.m creates a specgraph.stemseries with complex values provided for YData. However, it seems that the YData cannot hold complex data and the real part is kept. This feels like a bug, but it appears to be by design if the plot docs apply to stem.
As stated by MathWorks about the plot command (apparently applies to stem):
When the arguments to plot are complex (i.e., the imaginary part is nonzero), All MATLAB® graphics functions ignore the imaginary part except when plot is given a single complex data argument. For this special case, the command produces a plot of the real part versus the imaginary part. Therefore,
plot(Z)where Z is a complex vector or matrix, is equivalent to
plot(real(Z),imag(Z))
There does appear to be a bug in stem and stairs pointed out by David and Daniel R., where the proper XData is not set with the first (single-argument) syntax. The source of the bug in stem.m seems to be here:
if hasXData
xdata = {'XData', datachk(x(:,k))};
end
The problem is that hasXData is set above by hasXData = nargs ~= 1;. I think this should perhaps be something like:
hasXData = nargs ~= 1 || ~isreal(args{1});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With