Ruby 作为数字而不是字符串的和矩阵

Ruby 作为数字而不是字符串的和矩阵,ruby,csv,matrix,Ruby,Csv,Matrix,我试图从CSV文件中求出2个矩阵的和 目前,我将它们放入到数组中,然后将数组转换为矩阵。然而,当我打印它们时,我得到的是串联的字符串,而不是求和的整数 require 'csv' require 'matrix' matrix1 = "./matrix1.csv" matrix2 = "./matrix2.csv" line_count = 0 elements_in_line_count = 0 arr1 = Array.new #=> [] arr2 = Array.new

我试图从CSV文件中求出2个矩阵的和 目前,我将它们放入到数组中,然后将数组转换为矩阵。然而,当我打印它们时,我得到的是串联的字符串,而不是求和的整数

require 'csv'
require 'matrix'

matrix1 = "./matrix1.csv"
matrix2 = "./matrix2.csv"

line_count = 0
elements_in_line_count = 0
arr1 = Array.new    #=> []
arr2 = Array.new    #=> []

CSV.foreach(matrix1) do |row|
  arr1 << row
  line_count += 1
  elements_in_line_count =  row.size
end

n1 = elements_in_line_count
m1 = line_count 

# find n and m of second matrix 

line_count = 0
elements_in_line_count = 0

CSV.foreach(matrix2) do |row|
 # print row
   arr2 << row
  line_count += 1
  elements_in_line_count =  row.size
end

puts Matrix.rows(arr1) + Matrix.rows(arr2)
CSV 2也一样。 输出是

Matrix[[11, 22], [33, 44]]

但我希望它是[2,4],[6,8]

当您在CSV中读取时,所有列都是字符串,因此您必须手动将其转换为代码中的数字

如果CSV的所有列都是数字,则可以将
.map(&:to_i)
添加到行中。像这样:

CSV.foreach(matrix1) do |row|
  arr1 << row.map(&:to_i) # <-- this will turn everything in the row into a number
  line_count += 1
  elements_in_line_count =  row.size
end
CSV.foreach(matrix1)do|行|

arr1当您在CSV中读取时,所有列都将是字符串,因此您必须手动将其转换为代码中的数字

如果CSV的所有列都是数字,则可以将
.map(&:to_i)
添加到行中。像这样:

CSV.foreach(matrix1) do |row|
  arr1 << row.map(&:to_i) # <-- this will turn everything in the row into a number
  line_count += 1
  elements_in_line_count =  row.size
end
CSV.foreach(matrix1)do|行|

arr1当您读取CSV时,默认情况下它会将所有行/列作为字符串读取,Ruby类可以将可选参数带到
foreach
new
以及类似的方法,称为
:converters
,用于转换每个适用的列。它可以采用的转换器之一是

:整数

转换任何整数()接受的字段

因此,您还可以将代码更改为:

csv_options = { converters: [:integer] }
CSV.foreach(matrix1, csv_options) do |row|
# ...
CSV.foreach(matrix2, csv_options) do |row|

要获得类似于对每行调用
map(&:to_i)
的结果。

在CSV中读取时,默认情况下,它会将所有行/列作为字符串读取,Ruby类可以为
foreach
new
以及类似的方法(称为
:converters
)提供一个可选参数,用于转换每个适用的列。它可以采用的转换器之一是

:整数

转换任何整数()接受的字段

因此,您还可以将代码更改为:

csv_options = { converters: [:integer] }
CSV.foreach(matrix1, csv_options) do |row|
# ...
CSV.foreach(matrix2, csv_options) do |row|

在每行中取得与调用<代码> map(&:tovii)相似的结果。

< P>当您要添加矩阵时,考虑使用Ruby的内置类,尤其是实例方法。

让我们首先构造三个CSV文件

fname1 = 't1.csv'
fname2 = 't2.csv'
fname3 = 't3.csv'

File.write(fname1, "1,2\n3,4")
  #=> 7
File.write(fname2, "100,200\n300,400")
  #=> 15
File.write(fname3, "1000,2000\n3000,4000")
  #=> 19
我们可以将基础矩阵求和如下

require 'csv'
require 'matrix'

fnames = [fname1, fname2, fname3]

fnames.drop(1).reduce(matrix_from_CSV(fnames.first)) do |t,fname|
  t + matrix_from_CSV(fname)
end.to_a
  #=> [[1101, 2202],
  #    [3303, 4404]]

def matrix_from_CSV(fname)
  Matrix[*CSV.read(fname, converters: [:integer])]
end

我从@Simple的答案中借用了
转换器:[:整数]
。我没有意识到这一点。

< P>当你想添加矩阵时,考虑使用Ruby的内置类和具体的实例方法。

让我们首先构造三个CSV文件

fname1 = 't1.csv'
fname2 = 't2.csv'
fname3 = 't3.csv'

File.write(fname1, "1,2\n3,4")
  #=> 7
File.write(fname2, "100,200\n300,400")
  #=> 15
File.write(fname3, "1000,2000\n3000,4000")
  #=> 19
我们可以将基础矩阵求和如下

require 'csv'
require 'matrix'

fnames = [fname1, fname2, fname3]

fnames.drop(1).reduce(matrix_from_CSV(fnames.first)) do |t,fname|
  t + matrix_from_CSV(fname)
end.to_a
  #=> [[1101, 2202],
  #    [3303, 4404]]

def matrix_from_CSV(fname)
  Matrix[*CSV.read(fname, converters: [:integer])]
end

我从@Simple的答案中借用了
转换器:[:整数]
。我不知道。

为什么不
映射{单元格}单元格。reduce(:+)}
?:-)@CarySwoveland因为之前的zip,总是有两个元素,这里的reduce是一个多余的元素。我无法控制自己。为什么不
映射{单元格|单元格。reduce(:+)}
?:-)@CarySwoveland因为之前的zip,总有两个元素,这里的reduce是一个过度使用。我无法控制自己。