如何在Ruby中将数字数组转换为矩阵

时间:2015-05-14 21:05:19

标签: ruby math matrix

我有两个简单的数字数组,代表一个物体的笛卡尔位置。

if(isset($_POST['nickname'])){
    $nickname= $_POST['nickname'];

    $sql4 = $dbh->prepare("SELECT nickname FROM registration WHERE nickname = :nickname");
    $sql4->execute(array(":nickname"=>$nickname));
    if($sql4->rowCount() > 0){
        echo "toto jméno již existuje";
    }

}

我想检查一下" a"和" b"彼此相邻。我想将两者转换成矩阵并执行两个位置的减法,然后检查任一元素的绝对值是否为" 1"。

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:2)

您首先需要获取未初始化的常量错误:

require 'matrix'

然后你可以:

Matrix[a,b]

交互式输出示例:

irb(main):011:0> require 'matrix'
=> true
irb(main):012:0> Matrix[a,b]
=> Matrix[[3, 4], [8, 5]]

答案 1 :(得分:1)

我不认为在这里使用Matrix类方法是合理的。唯一有用的方法是Matrix#-,但要使用它需要将数组转换为Matrix个对象,请应用Matrix#-,然后将生成的矩阵对象转换回数组确定任何元素的绝对值是否等于1(哇!)。我只是这样做:

def adjacent?(a,b)
  a.zip(b).any? { |i,j| (i-j).abs == 1 }
end

adjacent?([3, 4], [8, 5]) #=> true
adjacent?([3, 7], [8, 5]) #=> false
adjacent?([3, 7], [2, 5]) #=> true

对于第一个例子:

a = [3, 4]
b = [8, 5]
c = a.zip(b)
  #=> [[3, 8], [4, 5]]
c.any? { |i,j| (i-j).abs == 1 }
  #=> true

最后一个语句确定以下任何一个是true

(3-8).abs == 1
(4-5).abs == 1