2015-08-30 104 views
0

Ruby對矩陣求逆運算產生分數的結果,但對於矩陣乘法運算則不產生。例如,下面的代碼:部分中的矩陣乘法結果

require 'matrix' 

(Matrix[ [-1/2] ] * Matrix[ [1/2]]) 

產生Matrix[[0]]代替Matrix[[-1/4]]。爲什麼會這樣?

+0

@Swoveland您能解釋一下嗎? – user3051677

+0

我決定提供一個答案。 –

回答

1

你的問題已被確定,但你真正的問題還沒有得到解答,即當矩陣對象相乘時,產品的元素是什麼時候是整數,有理數還是浮點數?

如果ab是矩陣對象,的a*b每個元素將是:

  • 的整數,如果在它的計算中使用的ab所有元素是整數;
  • 一個有理數,如果在其計算中使用的ab的元素中至少有一個有理數,其餘爲整數或有理數;和
  • 如果在其計算中使用的至少一個要素ab是浮點數,則爲浮點數。

我會舉幾個例子,但首先讓我們來看看Ruby如何表示有理數。有理數是可以表示爲兩個整數的比例的數字。例如,1.5是一個有理數,因爲它可以表示爲3/2。但是,我們不能在Ruby中這樣寫,因爲3/2將被替換爲整數除法的結果1。相反,我們創建一個實例類Rational的:

r = Rational(3,2) 
    #=> (3/2) 

,並使用在計算中。 (注意在返回值的括號)。我們可以提取它的分子和分母,或者將其轉換爲一個整數(四捨五入向下或向上)或浮動:

r.numerator 
    #=> 3 
r.denominator 
    #=> 2 
r.to_i 
    #=> 1 
r.ceil 
    #=> 2 
r.to_f 
    #=> 1.5 

現在讓我們來看一些例子。

require 'matrix' 

Matrix[[Rational(-1,2)]] * Matrix[[Rational(1,2)]] 
    #=> Matrix[[(-1/4)]] 
Matrix[[-1]] * Matrix[[Rational(1,2)]] 
    # => Matrix[[(-1/2)]] 
Matrix[[-0.5]] * Matrix[[Rational(1,2)]] 
    #=> Matrix[[-0.25]] 
Matrix[[Rational(-1,2), Rational(1,2)]].transpose * Matrix[[Rational(1,2), 0.5]] 
    #=> Matrix[[(-1/4), -0.25], [(1/4), 0.25]] 

現在讓我們來考慮一個矩陣的逆:

Matrix[[Rational(-1,2), 1],[2, Rational(2,3)]].inverse 
    #=> Matrix[[(-2/7), (3/7)], [(6/7), (3/14)]] 
Matrix[[Rational(-1,2), 1.0],[2, Rational(2,3)]].inverse 
    #=> Matrix[[-0.2857142857142857, 0.4285714285714286], 
    #   [0.8571428571428571, 0.21428571428571427]] 

在計算與n行和列的矩陣的逆有n「旋轉」的步驟。如果,如在我的後一示例中,所述矩陣包含的整數,有理數和浮點的混合中,當執行每個樞軸操作:

  • 如果至少一個浮子中使用每個整數將被轉換爲一個浮其計算,否則如果在計算中至少使用一個理性,它將被轉換爲理性;否則它將保持一個整數;
  • 如果在計算中至少使用了一個浮點數,則每個有理數將被轉換爲浮點數,否則它將保持有理性;和
  • 每個浮動將保持浮動。

作爲「一旦浮動總是一個浮動」,它將不會很久之前計算矩陣的所有元素都是浮動。 (我相信可以證明,如果原始矩陣至少包含一個浮點數,反算符將包含所有浮點數。)

+0

感謝Sir Great !,爲您提出的問題提供了描述性的準確答案。特別是我期待你的確切答案。 – user3051677

1

您需要選擇正確的數據類型。 Int除以int是int。

1/2 -> 0 
1.0/2 -> 0.5 
1/2.0 -> 0.5 
0.5 -> 0.5 
1/2r -> (1/2) 
(1/2r).to_f -> 0.5 
Matrix[ [-1/2r] ] * Matrix[ [1/2r]] 

所以基本上Matrix[ [-1/2] ] * Matrix[ [1/2] ]相同Matrix[ [-1] ] * Matrix[ [0] ]

+0

雖然** Matrix [[-1/2]] * Matrix [1/2]的結果**與Matrix [[0]] * Matrix的結果**相同[ [0]]',它們不是直接相同的。 – sawa

+2

@sawa,對不起,'Matrix [[-1/2]] * Matrix [1/2]'與Matrix [[-1]] * Matrix [[0]]相同' – fl00r

1

沒有爲整數除法沒有小數結果。例如,5除以3爲1,餘數爲2.在您的代碼中,-1/2-1,而1/20-1 times 00

+1

如果還剩什麼不粘,我會建議「剩餘」或「剩餘」。 –

+0

@CarySwoveland是的,「餘數」更合適。我對複雜的分析(柯西的殘差定理)感到困惑。謝謝。 – sawa