【问题标题】:trying to create a matrix in ruby试图在 ruby​​ 中创建一个矩阵
【发布时间】:2011-11-03 11:06:07
【问题描述】:

我有一个名为 terin.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 的矩阵以及如何填充它??

【问题讨论】:

    标签: ruby matrix


    【解决方案1】:

    我会写:

    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】:

      其实没有。 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 
      

      【讨论】:

      • 您将如何使用枚举器?我正在尝试使用 Matrix.build(10,10)
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        无需声明尺寸。请尝试以下操作:

        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
        

        【讨论】:

          【解决方案5】:

          不需要尺寸:

          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
          

          【讨论】:

            猜你喜欢
            • 2023-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-23
            • 1970-01-01
            • 2021-11-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多