Ruby對矩陣求逆運算產生分數的結果,但對於矩陣乘法運算則不產生。例如,下面的代碼:部分中的矩陣乘法結果
require 'matrix'
(Matrix[ [-1/2] ] * Matrix[ [1/2]])
產生Matrix[[0]]
代替Matrix[[-1/4]]
。爲什麼會這樣?
Ruby對矩陣求逆運算產生分數的結果,但對於矩陣乘法運算則不產生。例如,下面的代碼:部分中的矩陣乘法結果
require 'matrix'
(Matrix[ [-1/2] ] * Matrix[ [1/2]])
產生Matrix[[0]]
代替Matrix[[-1/4]]
。爲什麼會這樣?
你的問題已被確定,但你真正的問題還沒有得到解答,即當矩陣對象相乘時,產品的元素是什麼時候是整數,有理數還是浮點數?
如果a
和b
是矩陣對象,的a*b
每個元素將是:
a
和b
所有元素是整數;a
和b
的元素中至少有一個有理數,其餘爲整數或有理數;和a
和b
是浮點數,則爲浮點數。我會舉幾個例子,但首先讓我們來看看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
「旋轉」的步驟。如果,如在我的後一示例中,所述矩陣包含的整數,有理數和浮點的混合中,當執行每個樞軸操作:
作爲「一旦浮動總是一個浮動」,它將不會很久之前計算矩陣的所有元素都是浮動。 (我相信可以證明,如果原始矩陣至少包含一個浮點數,反算符將包含所有浮點數。)
感謝Sir Great !,爲您提出的問題提供了描述性的準確答案。特別是我期待你的確切答案。 – user3051677
您需要選擇正確的數據類型。 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] ]
沒有爲整數除法沒有小數結果。例如,5除以3爲1,餘數爲2.在您的代碼中,-1/2
爲-1
,而1/2
爲0
。 -1
times 0
是0
。
如果還剩什麼不粘,我會建議「剩餘」或「剩餘」。 –
@CarySwoveland是的,「餘數」更合適。我對複雜的分析(柯西的殘差定理)感到困惑。謝謝。 – sawa
@Swoveland您能解釋一下嗎? – user3051677
我決定提供一個答案。 –