Matlab 茎(x)与复合物x的行为

Matlab 茎(x)与复合物x的行为,matlab,plot,Matlab,Plot,在回答最近的一个问题时,我遇到了一个与stem有关的奇怪行为。试试这个: x = [1+j 2-j 3+j 4-j]; stem(x) 在我的Matlab版本(2010b)中,这绘制了x的虚部,而不是我预期的实部。相反, stem(1:length(x),x) 绘制x的真实部分,这与plot(1:length(x),x)的行为一致 你能想出为什么stem(x)绘制x的虚部而不是实部的原因吗?特别是当杆(1:长度(x),x)绘制真实零件时。还是我们应该断定这是一个bug?据我所知,这是部分正确

在回答最近的一个问题时,我遇到了一个与
stem
有关的奇怪行为。试试这个:

x = [1+j 2-j 3+j 4-j];
stem(x)
在我的Matlab版本(2010b)中,这绘制了
x
的虚部,而不是我预期的实部。相反,

stem(1:length(x),x)
绘制
x
的真实部分,这与
plot(1:length(x),x)
的行为一致


你能想出为什么
stem(x)
绘制
x
的虚部而不是实部的原因吗?特别是当
杆(1:长度(x),x)
绘制真实零件时。还是我们应该断定这是一个bug?

据我所知,这是部分正确的行为。输入虚部时,实部和虚部被视为x和y值对(即在
xychk.m
中,
x=real(y);y=imag(y);
)。这就解释了为什么虚部在y轴上

但是,当您使用第二个参数输入x轴值时,它会从第一个输入参数获取x轴值,并将
y
的实部视为y轴数据。具体地说,当调用
stem(1:length(x),x)
时,
stem.m
创建一个
specgraph.stemseries
,并为
YData
提供复数值。然而,
YData
似乎无法保存复杂的数据,而实际的部分被保留了下来。这感觉像是一个bug,但如果
绘图
文档应用于
stem
,这似乎是出于设计

关于
plot
命令(显然适用于
stem
):

当绘图参数为复数(即虚部为非零)时,所有MATLAB®图形函数均忽略虚部,除非绘图参数为单个复数数据参数。对于这种特殊情况,该命令生成实部与虚部的对比图。所以,

绘图(Z)

其中Z是复数向量或矩阵,相当于

plot(实(Z)、imag(Z))

在David和Daniel R指出的
stem
stairs
中确实存在一个bug
,其中正确的
XData
没有设置第一个(单参数)语法。
stem.m
中的错误源似乎在这里:

if hasXData
    xdata = {'XData', datachk(x(:,k))};
end
问题是上面的
hasXData=nargs~=1设置了
hasXData
。我认为这应该是这样的:

hasXData = nargs ~= 1 || ~isreal(args{1});

仅提及
楼梯
具有相同的行为。但是如果你这样做
x=[1+j2-j3+j10-j]
然后x轴点是1、2、3和4,而不是1、2、3和10,
stem(x)
生成一个不同于
stem(实(x)、imag(x))
的图形。对于
stem([1+i,3,5-i])(1,1)(2,0)(3,-1)
@David(和Daniel R.)有趣观察结果的图。我同意这是一个bug,我在
stem.m
中猜测了它的来源。不过,在单输入语法中,为什么假想的组件最终会出现在y轴上似乎很清楚。@chappjc当然!我怎么没想到呢<代码>绘图(x)
带有
x
复合体也绘制图像与真实图像。经验教训:不要选择太简单的事情,比如1:4作为例子