2012-07-02 89 views
1

我遇到了一个小问题,我认为它与Matlab的精度有关,但我真的想解决这个问题。我有三个矩阵,一个叫做f,尺寸为296x3118,另一个叫mapping.mean,尺寸为1x3118,最后一个叫mapping.M,尺寸为3118x100。
以下操作的结果应该是1,但事实并非如此。结果矩阵f_s_1f_s_2的值仅在10^-12的范围内有所不同。有人知道为什么,或者如何解决这个问题?相同的矩阵运算在Matlab中返回不同的结果

f_s_1 = ((f(1:296,:)-repmat(mapping.mean,296,1))*mapping.M)'; 
f_s_2 = ((f(1:295,:)-repmat(mapping.mean,295,1))*mapping.M)'; 
isequal(f_s_1(:,1:295),f_s_2) 

ans = 

0 

回答

3

你们看到的是在MATLAB Round-off error结果和可能来自于大矩阵运算的并行化。对于非常大的矩阵运算,这意味着解决方案的所有部分都可以同时计算,然后在最后进行组合。由于不同的部分可能迟早会完成,或者由原始问题的不同部分组成,因此可以得到不同的结果。由于您的计算机只使用少量的位来表示您的编号(在您的matlab版本中它可能使用64位),所以在执行操作时,通常会有一小部分十进制数字被切断。事实上,当你将一个非常大的数字添加到一个非常小的数字时,计算机可能只会返回非常大的数字,因为没有更多空间来表示较小的数字。

例如,尝试运行下面的代码:

mybase = 1e17; 

sum1 = mybase + sum(1e-4*ones(2^14,1)) - mybase 
sum2 = mybase - mybase + sum(1e-4*ones(2^14,1)) 

你应该得到:

sum1 = 

    0 


sum2 = 

    1.6384 
即使款项只是重新安排

,它们会导致不同的数字。如果你玩弄它,你会发现MATLAB从左到右添加数字,当数字在数量上差别很大时,问题就开始出现。由于1.6384是1e17的一小部分,我们可能会认为它根本不是真正的错误......但显然答案是错误的,并且全都是因为我们的总和的排序。

为什么这里有关?正如我们之前提到的,如果MATLAB选择并行操作,那么问题的每个部分将在同一时间被计算,然后被组合。根据许多事情(问题的大小,计算机正在做的其他事情等),这些作品可能会以不同顺序添加。这意味着结果会稍有不同。如果您在我的版本(R2012a)上将矩阵设置为相同尺寸,则可能会得到相同的答案...或者您可能不会。此外,它将取决于大小。

此行为是一个“功能”,我用maxNumCompThreads(1)

+0

感谢您的答复时,得到了同样的答案,甚至。 – SwatchPuppy

相关问题