矩阵乘法导致分数

时间:2015-08-30 11:22:24

标签: ruby

Ruby产生的结果是矩阵逆运算的分数,但不是矩阵乘法运算的结果。例如,代码如下:

require 'matrix'

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

产生Matrix[[0]]而不是Matrix[[-1/4]]。为什么会出现这种情况?

3 个答案:

答案 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-11/20-100

答案 2 :(得分:1)

您的问题已被确定,但您的真实问题尚未得到解答,即,当乘以矩阵对象时,何时该产品的元素是整数,有理数还是浮点数?

如果 <head> <base href="~/" /> </head> a是矩阵对象,b的每个元素都将是:

  • 如果计算中使用的a*ba的所有元素都是整数,则为整数;
  • 一个有理数,如果在其计算中使用的ba元素中至少有一个有理数,其余为整数或有理数;和
  • 如果计算中使用的ba中的至少一个元素是浮点数,则为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个“旋转”步骤。如果在后一个例子中,矩阵包含整数,有理数和浮点数的混合,则在执行每个数据透视操作时:

  • 如果在计算中使用至少一个float,则每个整数将转换为float,否则如果在计算中使用至少一个rational,则将其转换为rational;否则它将保持整数;
  • 如果在计算中至少使用一个浮点数,则每个有理数将被转换为浮点数,否则它将保持理性;和
  • 每个浮子都会浮动。

由于“一旦浮点数始终是浮点数”,所以计算矩阵的所有元素都是浮点数之前不久。 (我相信可以证明,如果原始矩阵包含至少一个浮点数,则逆将包含所有浮点数。)