我在 Matlab 中有两个向量, z
和 beta
。向量 z
是 1x17:1 0.430742139435890 0.257372971229541 0.0965909090909091 0.694329541928697 0 0.394960106863064 0 0.100000000000000 1 0.264704325268675 0.387774594078319 0.269207605609567 0.472226643323253 0.750000000000000 0.513121013402805 0.697062571025173
...而 beta
是 17x1:6.55269487769363e+2600-56.3867588816768-2.21310778926413057.072605200984703.47223691057151e+27-1.00249317882651e+273.382022320466861.164259879690270.229504956512063-0.314243264212449-0.2573943125883300.498644243389556-0.852510642195370
我正在处理一些奇点问题,我注意到如果我想计算 z*beta
的点积,我可能会得到 2 个不同的解决方案。如果我使用 *
命令, z*beta = 18.5045
。如果我编写一个循环来计算点积(如下),我会得到 0.7287 的解。
summation=0;
for i=1:17
addition=z(1,i)*beta(i);
summation=summation+addition;
end
知道这里发生了什么吗?
这是数据的链接:https://dl.dropboxusercontent.com/u/16594701/data.zip
最佳答案
这里的问题是浮点数的加法是 而不是关联的 。当对一系列具有可比量级的数字求和时,这通常不是问题。但是,在您的序列中,大多数数字都在 1 或 10 左右,而一些条目的数量级为 10^26 或 10^27。在这种情况下,数值问题几乎是不可避免的。
维基百科页面 http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems 显示了一个工作示例,其中 (a + b) + c
不等于 a + (b + c)
,即证明您添加浮点数的顺序确实很重要。
我猜这是一个家庭作业,旨在说明这些确切的问题。如果没有,我会问数据代表什么来确定适当的方法。与试图理解包含它们的点积相比,首先找出为什么会产生如此大的数字可能会更有成效。
关于matlab - 点积 : * Command vs. Loop 给出不同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16201305/