【问题标题】:Increase precision of MATLAB variable/data point from a plot提高绘图中 MATLAB 变量/数据点的精度
【发布时间】:2014-11-24 23:52:04
【问题描述】:

我正在绘制一个控制系统,我需要证明来自 MATLAB 的稳态误差与我的计算一致。

我的计算给了我0.000833333,并且在绘图上,数据提示标记的精度非常低(我选择的位置没有小数点)。

但是我可以右键单击标记并选择Export cursor data to workspace...

这给了我X=98.0037Y=98.0028的位置

这给了我一个0.0009 的错误,所以它不是计算中的0.00083333。我知道这是正确的,但是我只是想知道如何提高变量/数据点的精度,如果可能的话,可以从小数点后 4 位开始。

【问题讨论】:

  • 在控制台中输入format long,然后再次查看导出的光标位置。
  • 啊,我们走了!我还意识到我需要做的就是在数组中单击,这也很有效。非常感谢。随意写出来作为答案。

标签: matlab


【解决方案1】:

有许多不同的途径可以从这些数据提示游标中获得更高的精度:

1) 手动导出:

正如您在问题中提到的,右键单击数据提示,然后选择 Export cursor data to workspace...。假设您在默认变量cursor_info 中导出它,然后您会得到一个包含 3 个字段的结构:

cursor_info = 
       Target: 492.0040
     Position: [7.3593e+05 10.6353]
    DataIndex: 7

Targetline 对象的句柄捕捉到光标
Position 是一个 1x2 向量,给出了 xy 的坐标选定的数据点(如果定义了z 坐标,它将具有第三个值)
DataIndex 是用于绘制线的数组中选定数据点坐标的索引。所以你也可以要求:

>> x(7) %// or "x(cursor_info.DataIndex)" would be the same
ans =
   7.3593e+05
>> y(7)
ans =
   11.3200

现在默认情况下,控制台中的值显示仅限于几位数字,但变量中的数字具有更高的精度。 2种显示更精确的方法:

第一种方法是在控制台中输入format long。之后,您在控制台中的所有数字输出都将是 15 位数字:

>> cursor_info.Position
ans =
   1.0e+05 *
   7.359289702215524   0.000106353183026

第二种方法是通过使用格式说明符和sprintffprintf 来强制达到您想要的精度:

>> fprintf('x=%15.15d y=%g \n',cursor_info.Position)
x=7.359289702215524e+05 y=10.6353

2) 以编程方式导出

除了手动导出 cursor_info 数据之外,您还可以使用代码调用它:

dcm = datacursormode(gcf) ;
cursor_info = dcm.getCursorInfo ;

然后,您将获得与手动导出相同的 cursor_info 变量。显示值的方法与上述相同。

3) 直接显示(以所需的精度)。

您还可以完全自定义数据提示将显示的内容,不仅包括位置,还包括一些计算或转换的值。右键单击数据提示并选择Edit text update function。这将打开一个编辑器窗口,其中包含数据提示的当前代码,它基本上查询数据提示位置并创建要显示的文本元胞数组。根据您的需要修改此功能,然后将其保存在您可以检索的地方。

对于我使用的数据的示例,我以不同的精度显示 xy 坐标,然后基于 2 个值进行计算,我还将 x 坐标转换为日期表示.

function output_txt = myModifiedDatatip(obj,event_obj)

pos = get(event_obj,'Position');
output_txt = {['X: ',num2str(pos(1),12)],... %// default code, only the output precision is changed
              ['Y: ',num2str(pos(2),8)]};

%// add all the informations you want to calculate and display directly here:
output_txt{end+1} = ['error (y-x): ',sprintf('%16f', pos(2)-pos(1))]; %// difference between x and x
output_txt{end+1} = ['Date: ', datestr(pos(1))]; %// display the date/time 

此示例将显示如下所示的数据提示:

之后,在任何后续绘图或图形中,您可以通过右键单击数据提示select text update function,然后指向您之前保存的数据提示函数来重新应用此数据提示格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多