Matlab中Quiver函数向量长度不一致问题咨询
为什么第二段代码的箭头视觉长度不统一?
这个问题的核心在于Matlab中quiver箭头的视觉长度和坐标轴的刻度比例直接相关,结合你的两段代码差异,具体原因如下:
1. 两段代码的网格步长与坐标轴比例不同
第一段代码中:
[T,Y]=meshgrid(-4:0.5:4,-4:0.5:4);这里x(T)和y(Y)的范围都是
-4到4,步长都是0.5,坐标轴的刻度比例是1:1。当你用1./L和S./L归一化向量后,每个向量的数学模长都是1,且x、y方向的单位视觉长度一致,所以箭头看起来完全等长。第二段代码中:
t=linspace(-2,2,16); y=linspace(-4,4,16); [T,Y]=meshgrid(t,y);x(t)的范围是
-2到2(总长度4),y(y)的范围是-4到4(总长度8),且x方向步长为4/15≈0.2667,y方向步长为8/15≈0.5333。默认axis tight下,Matlab会让坐标轴刚好包裹数据,此时x、y轴的单位视觉长度并不相等(比如x轴1个单位的像素宽度会远大于y轴1个单位的像素高度,反之亦然,取决于figure的默认尺寸)。即使你计算的向量数学模长是1(
sqrt( (1/L)^2 + (S/L)^2 )=1),但因为x、y方向的单位视觉长度不同,箭头的视觉长度自然会出现差异。
2. 验证与解决方法
如果想让第二段代码的箭头视觉长度统一,只需在代码末尾添加axis equal,强制x、y轴的单位视觉长度一致:
t=linspace(-2,2,16); y=linspace(-4,4,16); [T,Y]=meshgrid(t,y); S=Y./T+3*T; L=sqrt(1+S.^2); quiver(T,Y,1./L,S./L) axis tight axis equal % 添加这一行
此时你会看到所有箭头的视觉长度完全一致。
补充说明
另外注意第二段代码中S=Y./T+3*T,当T接近0时Y./T会产生极大值,但因为你做了归一化处理,这些向量的数学模长依然是1,所以不会出现箭头异常过长的情况——只是视觉上因为轴比例问题显得和其他箭头长度不同。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

