试图在ruby中创建一个矩阵

时间:2011-11-03 11:06:07

标签: ruby matrix

我有一个名为terain.dat的文件,其中包含以下矩阵:

10
1 1 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 12 12 12
1 2 3 4 5 6 7 12 12 12
1 2 3 4 5 6 7 12 12 12

我想在文件中读取并使用第一行的第一个数字作为矩阵的大小(在这种情况下为10 X 10)。然后使用下面的数字填充10 X 10矩阵。

这是我到目前为止所做的:

    class Terrain     

              def initialize file_name

              @input = IO.readlines(file_name) #read in file  # reads in the file with the terrain detials
              @matrix_size =  @input[0].to_i  # changes the first index to an int (so i can make a10X10 matrix)
              @land = Matrix.[@matrix_size, @matrix_size]  # will this make a 10 X 10 matrix??

           end
  end

我想知道这是否会产生一个10X10矩阵,我该如何填充它?

5 个答案:

答案 0 :(得分:3)

实际上没有。 Matrix.[]用于设置行的值。 因此Matrix.[10,10]将创建一个包含2行的Matrix,并在每列中创建一个10。

您要搜索的内容为Matrix.build(row_size, column_size),其中column_size默认为row_size。这为您提供了一个可用于设置值的枚举器。 (或者您只是将一个块传递给Matrix.build

我建议采用不同的方法:

arr = []
@input.each_index do |index|
  arr[index] = @input[index].split ' ' 
end
@land = Matrix.build(10,10) do |row, column|
  arr[row][column].to_i
end 

答案 1 :(得分:3)

我写道:

terrain = open("terrain.data") do |file|
  size = file.lines.first.to_i
  rows = file.lines.first(size).map { |line| line.split.map(&:to_i) }
  Matrix.rows(rows)
end

答案 2 :(得分:0)

您可以跳过第一行,阅读其他行,选择它们以删除新行,然后在空白处拆分。这将为您提供一系列数组,您可以将其提供给Matrix.rows

答案 3 :(得分:0)

无需声明尺寸。请尝试以下方法:

class Terrain     
  attr_accessor :m
    def initialize file_name
      data = IO.readlines(file_name)
      data.each_line do |l|
        data << l.split.map {|e| e.to_i}
      end
      @m = Matrix[*@data]
   end
end

或者,甚至更好:

class Terrain     
  attr_accessor :m
    def initialize file_name
      File.open(file_name).each do |l|
        data << l.split.map {|e| e.to_i}
      end
      @m = Matrix[*@data]
   end
end

答案 4 :(得分:0)

无需大小:

class Terrain     
  def initialize(file_name)
    File.open(file_name) do |f|
      @m = Matrix[*f.lines.map { |l| l.split.map(&:to_i) }]
    end
  end
end