2012-04-29 27 views
9

Có cách nào được xây dựng để in ma trận có thể đọc được trong Ruby không?In ma trận có thể đọc được trong Ruby

Ví dụ

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

và có nó hiển thị

=> 1 2 
    3 4 

trong REPL thay vì:

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

The Ruby Documents cho matrix làm cho nó trông giống như đó là những gì cần hiển thị xảy ra, nhưng đó không phải là những gì tôi thấy. Tôi biết rằng nó sẽ là tầm thường để viết một chức năng để làm điều này, nhưng nếu có một 'đúng' cách tôi muốn tìm hiểu!

Trả lời

8

Bạn có thể chuyển nó sang một mảng:

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

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

EDIT:

Đây là một "điểm miễn phí" phiên bản:

puts m1.to_a.map(&:inspect) 
1

Bạn có thể sử dụng each_slice phương pháp kết hợp với column_size.

m1.each_slice(m1.column_size) {|r| p r } 
=> [1,2] 
    [3,4] 
3

Tôi không thể làm cho nó trông giống như tài liệu vì vậy tôi đã viết một hàm cho bạn hoàn thành nhiệm vụ tương tự.

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 
3

Tuyên bố từ chối trách nhiệm: Tôi là nhà phát triển chính cho NMatrix.

Nó tầm thường ở NMatrix. Chỉ cần thực hiện matrix.pretty_print.

Các cột không được căn chỉnh một cách rõ ràng, nhưng sẽ dễ sửa chữa và chúng tôi muốn có bất kỳ đóng góp nào cho hiệu ứng đó.

Ngẫu nhiên, rất vui được gặp một người bạn VT ở đây. =)

+2

Tôi chắc chắn sẽ xem SciRuby/NMatrix. Tôi là người mới đối với Ruby nên tôi hy vọng sẽ sử dụng nó cho một dự án tốt nghiệp để học thêm một chút nữa. Thực tế là ma trận chuẩn trong Ruby là bất biến khiến tôi trở về mặc định trở lại C#. Không biết nếu libs bên thứ 3 sẽ bay với giáo sư của tôi và đã được trên một cuộc khủng hoảng. Ngoài ra - Chúng tôi đã tốt nghiệp cùng năm tại VT, rất tuyệt khi thấy bạn đang ở UT. Tôi là Toán/CS và có thể quan tâm đến việc cho vay đối với dự án của bạn, tôi sẽ gửi cho bạn một tin nhắn. – vpiTriumph

1

Ok, tôi là tổng số người mới tham gia chương trình Ruby. Tôi chỉ đang thực hiện những cuộc xâm lược đầu tiên của mình, nhưng điều đó xảy ra tôi gặp vấn đề tương tự và thực hiện phương pháp tiếp cận nhanh chóng này. Làm việc với thư viện Ma trận chuẩn và sẽ in các cột được định dạng có cùng kích thước.

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 

Mọi chỉnh sửa hoặc nâng cấp đều được chào đón!

1

này đang làm việc cho tôi

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 
0

Dưới đây là câu trả lời của tôi:

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" 

Bạn có thể sử dụng Matrix#to_pretty_s để có được một chuỗi khá cho định dạng.

0

Không có cách nào để tạo điều này cho Ruby. Tuy nhiên, tôi đã tạo ra một Mô-đun có thể được đưa vào Ma trận bao gồm một phương pháp readable. Bạn có thể tìm thấy mã này here, nhưng nó cũng nằm trong khối mã sau đây.

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 
Các vấn đề liên quan