2012-12-07 40 views
3

在檢查一些矩陣乘法運算時,我遇到了一個奇怪的行爲。當我「手動」執行乘法(使用積和和)以及使用矩陣乘法運算符%*%時,會得到不同的結果。R中的矩陣乘法,奇怪的結果

c <- 1:10 
a <- 100^(0:9) 
p1 <- sum(a*c) 
p2 <- a%*%c 
p1==p2 
     [,1] 
[1,] FALSE 
p1-p2 
     [,1] 
[1,] -2048 

然而,當我使用任何其他值的(例如,一個< - 101^0:9),我得到了相同的結果:

c <- 1:10 
a <- 101^(0:9) 
p1 <- sum(a*c) 
p2 <- a%*%c 
p1==p2 
     [,1] 
[1,] TRUE 
p1-p2 
     [,1] 
[1,] 0 

任何想法,爲什麼這種情況正在發生?

謝謝 佩德羅

+2

請參閱[this](http://stackoverflow.com/questions/9508518/why-are-these-numbers-not -等於)。使用'all.equal'來測試是否相等。 – Roland

+0

雖然這是在R-FAQ中,但看到它真的是一個「新手計算機數學」常見問題解答,有沒有什麼地方可以提供答案? –

+0

「任何其他值」不一定是好的。嘗試'f < - 函數(b){a < - b ^(0:9); c < - 1:10; sum(a * c) - a%*%c}; bvec < - 80:120; r < - sapply(bvec,f); plot(bvec,r,type =「b」)' –

回答

2

%*%不計算在一個稍微不同的方式,這意味着發生在不同的地方不同的舍入誤差的結果,導致了不同的整體效果。

我只是猜測,但我認爲,這可能由於sum保持其蓄能器在機器浮點寄存器,其中有英特爾架構80 bit extended precision。如果你想知道確切的話,你必須看看彙編代碼R.

+0

如果你打算去那條路線,你可以將數據轉換爲'mpfr'類(參見'Rmpfr'包)。 –