MATLAB社区

MATLAB、社区和更多

如何成为顶尖的数学家

我认为自己是一个很好的厨师,但我没有顶级大厨。在顶级大厨参赛者必须做饭成分完美,需要单控制温度的炉具和烹饪时间精确到秒。对我来说,我只有为生存和竞争不够钱,所以我要美味,好完美;如果出来一个小橡皮,那又怎样?

计算机,另一方面,没有一个本地的概念“足够好。“电脑需求完美和精确。幸运的是编程语言(如MATLAB)为我们提供了简单的方法很容易实现一定程度的精度和可重复的。

这并不总是容易确定您所使用的精度。例如那些不熟悉IEEE浮点数表示,以下可能令人惊讶的结果:

0.1 + 0.1 + 0.1 - 0.3
ans = 5.5511 e - 017

为什么我们得到这个结果,我们预计0 ?乍一看这两个数字看起来完全相同:

0.1 + 0.1 + 0.1 - 0.3
答答= 0.3000 = 0.3000

幸运的是命令窗口有一个特殊的函数来帮助我们理解发生了什么。的格式函数控制数字表示在输出命令窗口。

首先我们可以试一试长格式。

格式0.1 + 0.1 + 0.1 - 0.3
答答= 0.300000000000000 = 0.300000000000000

长格式给我们很多额外的数字,但仍然没有告诉我们这两个数字之间的区别。看到的差异,我们需要看实际的64位浮点数表示。

格式十六进制0.1 + 0.1 + 0.1 - 0.3
ans fd3333333333333 = 3 fd3333333333334 ans = 3

你可以看到,这两个数字都接近但不完全相同的。代表数字的原因是电脑,我们需要样品之间的无限的数字10 ^ -308 - 10 ^ + 308,导致舍入。这舍入误差是衡量两个连续的数字之间的区别,使用神奇的功能每股收益。这是一个很好的解释technical note 1108。这种微妙的不同类型和数量计算可以在程序流很重要,等如果,,语句。数字表示对文件I / O也很重要。

最基本的文本文件操作使用。我们可以看到,使用默认的浮点表示我们不回到相同的数字,我们开始。如果这些数字是系数,我们甚至可以破坏一个系统之前,我们开始分析。

格式一个=兰德(5);fid = fopen (“data.dat”,' w ');流(fid检测器,' % f ',);文件关闭(fid);fid = fopen (“data.dat”,“r”);A2 = fscanf (fid,' % f '5 [5]);文件关闭(fid);马克斯(A-A2)
ans = 1.0 e - 006 * 0.4303 0.4098 0.2859 0.2926 0.4377

再一次,这一天是保存与十六进制符号。这里有点棘手,因为我选择阅读的角色fscanf。如果你运行这个位在家里,比较两个文本文件。第一个是漂亮的、人类可读的,但第二个最好的精密计算机。

fid = fopen (“data2.dat”,' w ');流(fid检测器,“% bx”,);文件关闭(fid);fid = fopen (“data2.dat”,“r”);A3 = fscanf (fid,“% c”[正]16日);文件关闭(fid);A3 = hex2num (A3);A3 =重塑(A3 5 5);马克斯(A-A3)
ans = 0 0 0 0 0

这个问题也发生在其他文本文件格式,如CSV。如果你在windows上,Microsoft Excel提供了一个良好的平衡,因为文件简单易读的,但是数据是存储在二进制。

csvwrite (“data.csv”,);A4 = csvread (“data.csv”);马克斯(a4的)xlswrite (“data.xls”一)A5 = xlsread (“data.xls”);马克斯(A-A5)
ans = 1.0 e - 005 * 0.4092 0.3846 0.2146 0.4540 0.4040 ans = 0 0 0 0 0

精确考虑不只是为命令行功能。他们应该牢记当导入/导出从我们的gui和仿真软件模型。万博1manbetx例如,我最喜欢的一个工具箱,滤波器设计的工具箱。当我在技术支持工作,我帮助客户度过这一问题。万博1manbetx出口后他的系数和进口成不同的工具,他看见一个完全不同的过滤器。下面我把出口到窗口,有几个不同的选择输出格式。我们的大多数gui工具箱有类似的选择,在没有的情况下,通常有一个命令行功能设置所需的精度。

FDA工具导出选项

如果你只是要从MATLAB,,等待最好的结果保存数据时,使用的MAT-file保存和加载命令。在这种情况下,你可以使用在浏览器工作区导出按钮。

工作空间浏览器保存按钮

符合之前的系列,保存负载也有一个不错的ASCII选项:

保存data.mat美国信息交换标准代码总价值一个A6 =负载(“data.mat”,“ascii”);马克斯(A-A6)
ans = 0 0 0 0 0

最后一个有趣的浮点微妙;有两种不同的但相当于零。

格式十六进制0 = 0 minuszero = 0
0 = 0000000000000000 minuszero = 8000000000000000
|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。