我有一个名为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矩阵,我该如何填充它?
答案 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