Ruby产生的结果是矩阵逆运算的分数,但不是矩阵乘法运算的结果。例如,代码如下:
require 'matrix'
(Matrix[ [-1/2] ] * Matrix[ [1/2]])
产生Matrix[[0]]
而不是Matrix[[-1/4]]
。为什么会出现这种情况?
答案 0 :(得分: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] ]
答案 1 :(得分:1)
整数除法没有小数结果。例如,5除以3是1,其余为2.在您的代码中,-1/2
为-1
,1/2
为0
。 -1
次0
为0
。
答案 2 :(得分:1)
您的问题已被确定,但您的真实问题尚未得到解答,即,当乘以矩阵对象时,何时该产品的元素是整数,有理数还是浮点数?
如果 <head>
<base href="~/" />
</head>
和a
是矩阵对象,b
的每个元素都将是:
a*b
和a
的所有元素都是整数,则为整数; b
和a
元素中至少有一个有理数,其余为整数或有理数;和b
和a
中的至少一个元素是浮点数,则为float。我将举几个例子,但首先让我们考虑一下Ruby如何表达有理数。有理数是一个可以表示为两个整数的比率的数字。例如,b
是一个有理数,因为它可以表示为1.5
。但是,我们不能在Ruby中这样写,因为3/2
将被3/2
替换,整数除法的结果。相反,我们创建了类Rational的实例:
1
并在计算中使用它。 (注意返回值中的括号。)我们可以提取其分子和分母,或将其转换为整数(向下或向上舍入)或浮点数:
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
个“旋转”步骤。如果在后一个例子中,矩阵包含整数,有理数和浮点数的混合,则在执行每个数据透视操作时:
由于“一旦浮点数始终是浮点数”,所以计算矩阵的所有元素都是浮点数之前不久。 (我相信可以证明,如果原始矩阵包含至少一个浮点数,则逆将包含所有浮点数。)