OpenGL 图形工具包("qt" 和 "fltk")使用单精度进行渲染。这一限制尤其适用于使用 datenum、datestr、datestruct 和 datetick 函数,针对序列日期绘制时间序列的图形。
序列日期将时间戳编码为自公元零年以来的天数,小时、分钟和秒作为小数部分。1999 年 12 月 31 日的序列日期表示为 730485。具有该整数部分的双精度变量,其小数部分的分辨率可达 1.2e-10,约相当于 5 微秒。但在单精度下,分辨率降至约 0.06,即约 45 分钟。任何试图以更细粒度绘制带时间戳数据的操作,都会导致图形失真。
作为一种变通方法,可以使用 "gnuplot" 图形工具包,或者从时间值中减去 2000 年——即 datenum (2000, 0, 0) 或 730485。由于日历结构每 2000 年重复一次,因此年、月、日和星期之间的对应关系将保持不变,由 datetick 函数生成的刻度线和刻度标签仍然正确。唯一的问题是年份将缺少千位数字。例如,"2020" 将被显示为 "20"。示例如下:
# 以一分钟为步长的 24 小时时间戳
t = datenum (2020, 1, 1):(1/1440):datenum (2020, 1, 2);
# 示例时间序列数据
x = -cos (2*pi*t) + rand (size (t)) / 10;
subplot (1, 2, 1);
plot (t, x);
datetick ("x");
xlabel ("序列日期");
title ("问题");
subplot (1, 2, 2);
plot (t - 730485, x);
datetick ("x");
xlabel ("减去 2000 年");
title ("变通方法");
运行结果如图 图 15.8 所示。
图 15.8: OpenGL 图形工具包的单精度问题
类似地,其他数据也可以通过平移或重新缩放来解决这一问题。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2