2011-11-03 2 views
1

j'ai un fichier appelé terain.dat qui contient cette matrice:essayant de créer une matrice en Ruby

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 

je veux lire dans le fichier et utiliser le premier numéro sur la première ligne que la taille la matrice (qui est de 10 X 10 dans ce cas). Remplissez ensuite la matrice 10 X 10 avec les chiffres ci-dessous.

ce que j'ai jusqu'à présent:

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 

je me demandais si cela fera une matrice 10x10 et comment puis-je remplir ??

Répondre

3

actuellement non. Le Matrix.[] est utilisé pour définir les valeurs d'une ligne. Alors Matrix.[10,10] créeraient une matrice avec 2 lignes et dans chaque colonne un 10.

Ce que vous recherchez est Matrix.build(row_size, column_size)column_size par défaut row_size. Cela vous donne un énumérateur que vous pouvez utiliser pour définir les valeurs. (Ou que vous passez un bloc à Matrix.build

Je vous suggère une approche différente:

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

comment utiliseriez-vous le recenseur? J'essaie d'utiliser Matrix.build (10,10) – DustinRW

0

Vous pouvez sauter la première ligne, lisez les autres lignes, les tronquer pour éliminer les nouvelles lignes et divisé sur l'espace blanc Cela vous donnera un tableau de tableaux, que vous pouvez nourrir Matrix.rows

0

Pas besoin de déclarer la taille Essayez ce qui suit:...

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 

Ou, mieux encore:

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 
3

J'écris:

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 
0

Pas besoin de la taille:

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 
Questions connexes