пытаясь создать матрицу в ruby - PullRequest
1 голос
/ 03 ноября 2011

У меня есть файл с именем 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 ]

3 голосов
/ 03 ноября 2011

Я бы написал:

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
3 голосов
/ 03 ноября 2011

на самом деле нет.Matrix.[] используется для установки значений строки.Таким образом, Matrix.[10,10] создаст Матрицу с 2 строками, и в каждом столбце будет 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 
0 голосов
/ 03 ноября 2011

Нет необходимости в размере:

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
0 голосов
/ 03 ноября 2011

Не нужно объявлять размер. Попробуйте следующее:

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
0 голосов
/ 03 ноября 2011

Вы можете пропустить первую строку, прочитать другие строки, сжать их, чтобы удалить новые строки, а затем разбить на пробелы. Это даст вам массив массивов, которые вы можете передать Matrix.rows .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...