2012-07-02 23 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

相關問題