Ruby 作为数字而不是字符串的和矩阵
我试图从CSV文件中求出2个矩阵的和 目前,我将它们放入到数组中,然后将数组转换为矩阵。然而,当我打印它们时,我得到的是串联的字符串,而不是求和的整数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
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是一个过度使用。我无法控制自己。