11

Rubyで読み取り可能なマトリックスを印刷する組み込みの方法はありますか?

例えば

require 'matrix'
m1 = Matrix[[1,2], [3,4]]
print m1

見せてもらいます

=> 1 2
   3 4

代わりにREPLで:

=> Matrix[[1,2][3,4]]

マトリックス用のRubyDocsは、それが起こるべきことを示しているように見えますが、それは私が見ているものではありません。これを行うための関数を書くのは簡単だと私は知っていますが、「正しい」方法があれば、私はむしろ学びたいです!

4

9 に答える 9

14

あなたはそれを配列に変換することができます:

m1.to_a.each {|r| puts r.inspect}

=> [1, 2]
   [3, 4]

編集:

これが「ポイントフリー」バージョンです。

puts m1.to_a.map(&:inspect)
于 2012-04-29T06:15:04.243 に答える
6

ドキュメントのように見せることができなかったので、同じタスクを実行する関数を作成しました。

require 'matrix'

m1 = Matrix[[1,2],[3,4],[5,6]]

class Matrix
  def to_readable
    i = 0
    self.each do |number|
      print number.to_s + " "
      i+= 1
      if i == self.column_size
        print "\n"
        i = 0
      end
    end
  end
end

m1.to_readable

=> 1 2 
   3 4 
   5 6 
于 2012-04-29T07:18:43.947 に答える
3

免責事項:私はNMatrixのリード開発者です。

NMatrixでは簡単です。ただやってくださいmatrix.pretty_print

列はきれいに配置されていませんが、それは簡単に修正でき、その効果への貢献があれば幸いです。

ちなみに、ここでVTの仲間に会えてうれしいです。=)

于 2012-05-04T19:07:49.943 に答える
1

each_sliceメソッドと組み合わせて使用​​できますcolumn_size

m1.each_slice(m1.column_size) {|r| p r }
=> [1,2]
   [3,4]
于 2012-04-29T06:19:47.550 に答える
1

わかりました。私はRubyプログラミングの初心者です。私は最初の侵入をしているところですが、同じ問題が発生し、この迅速な「汚い」アプローチを行ったことがあります。標準のMatrixライブラリで動作し、同じサイズでフォーマットされた列を印刷します。

class Matrix
  def to_readable
   column_counter = 0
   columns_arrays = []
   while column_counter < self.column_size
     maximum_length = 0
     self.column(column_counter).each do |column_element|# Get maximal size
       length = column_element.to_s.size
       if length > maximal_length
         maximum_length = length
       end
     end # now we've got the maximum size
     column_array = []
     self.column(column_counter).each do |column_element| # Add needed spaces to equalize each column
      element_string = column_element.to_s
      element_size = element_string.size
      space_needed = maximal_length - element_size +1
      if space_needed > 0
        space_needed.times {element_string.prepend " "}
        if column_counter == 0
          element_string.prepend "["
        else
          element_string.prepend ","
        end  
      end
      column_array << element_string
    end
    columns_arrays << column_array # Now columns contains equal size strings
    column_counter += 1
  end
  row_counter = 0
  while row_counter < self.row_size
    columns_arrays.each do |column|
      element = column[row_counter]
      print element #Each column yield the correspondant row in order
    end
    print "]\n"
    row_counter += 1
  end
 end
end

修正やアップグレードは大歓迎です!

于 2013-11-19T21:18:59.753 に答える
1

これは私のために働いています

require 'matrix'

class Matrix

  def print
    matrix = self.to_a
    field_size = matrix.flatten.collect{|i|i.to_s.size}.max
    matrix.each do |row|
      puts (row.collect{|i| ' ' * (field_size - i.to_s.size) + i.to_s}).join('  ')    
    end
  end

end

m = Matrix[[1,23,3],[123,64.5, 2],[0,0,0]]
m.print
于 2015-07-05T22:14:46.907 に答える
0

これが私の答えです:

require 'matrix'

class Matrix
    def to_pretty_s
        s = ""
        i = 0
        while i < self.column_size
            s += "\n" if i != 0
            j = 0
            while j < self.row_size
                s += ' ' if j != 0
                s += self.element(i, j).to_s
                j += 1
            end
            i += 1
        end
        s
    end
end

m = Matrix[[0, 3], [3, 4]]

puts m # same as 'puts m.to_s'
# Matrix[[0, 3], [3, 4]]

puts m.to_pretty_s
# 0 3
# 3 4

p m.to_pretty_s
# "0 3\n3 4"

Matrix#to_pretty_sフォーマット用のきれいな文字列を取得するために使用できます。

于 2015-09-15T13:28:11.747 に答える
0

これを行うための組み込みのRubyの方法はありません。ただし、メソッドを含むMatrixに含めることができるモジュールを作成しましたreadable。このコードはここにありますが、次のコードブロックにもあります。

require 'matrix'

module ReadableArrays
    def readable(factor: 1, method: :rjust)
        repr = to_a.map { |row|
            row.map(&:inspect)
        }

        column_widths = repr.transpose.map { |col|
            col.map(&:size).max + factor
        }

        res = ""
        repr.each { |row|
            row.each_with_index { |el, j|
                res += el.send method, column_widths[j]
            }
            res += "\n"
        }
        res.chomp
    end
end

## example usage ##
class Matrix
    include ReadableArrays
end
class Array
    include ReadableArrays
end

arr = [[1, 20, 3], [20, 3, 19], [-32, 3, 5]]
mat = Matrix[*arr]

p arr
#=> [[1, 20, 3], [20, 3, 19], [-2, 3, 5]]
p mat
#=> Matrix[[1, 20, 3], [20, 3, 19], [-2, 3, 5]]

puts arr.readable
#=>
#    1 20  3
#   20  3 19
#  -32  3  5
puts mat.readable
#=>
#    1 20  3
#   20  3 19
#  -32  3  5
puts mat.readable(method: :ljust)
#=>
# 1   20 3
# 20  3  19
# -32 3  5
puts mat.readable(method: :center)
#=>
#  1  20  3
#  20  3 19
# -32  3  5
于 2018-01-20T22:31:40.407 に答える
0

私はまだこの問題を抱えていて、誰もここに投稿しているのを見たことがないので、誰かに役立つ場合は解決策を示します。2つのforループは最善のアイデアではないことはわかっていますが、小さいマトリックスの場合は問題ありません。また、require'matrix'や'pp'を使用しなくても、美しく、希望どおりに印刷されます。

matrix = Array.new(numRows) { Array.new(numCols) { arrToTakeValuesFrom.sample } }

for i in 0..numRows-1 do
  for j in 0..numCols-1 do
    print " #{matrix[i][j]} "
  end
  puts ""
end
于 2021-03-09T16:06:14.493 に答える