2009-09-26 3 views
0

Насколько я понял, матрицы очень негибкие для работы. Поэтому я пытаюсь получить массив векторов. Мои потребности: возможность добавлять векторы и делать арифметические операции над их компонентами. Напиши приведенный ниже код,Смуты: Матрицы, Векторы и массивы

require 'matrix' 

x = Matrix.rows(IO.readlines("input.txt").each {|line| line.split}) 

puts x.row_vectors 

рубин попадает в исключение. Зачем?

matrix.rb:1265:in `to_s': undefined method `join' for "1.2357 2.1742 -5.4834 -2.0735":String (NoMethodError) 

ОК, тогда я успокоился и попробовал другой подход. Я писал:

a = Array.[](IO.readlines("input.txt").each {|line| Vector.[](line.split) }) 

Но единственный способ, которым я могу получить доступ векторов внутри массива адресацию второго индекса:

puts a[0][0] 

Это означает, что, когда я хотел бы получить доступ к желаемому скаляру в векторе , я буду вынужден буду использовать третий индекс, например:

puts a[0][0][1] 

Итак, второй вопрос - где ад, что второй индекс происходит от? Как избавиться от него? Я что-то пропускаю при чтении данных в массив?

ответ

1

Я не могу воспроизвести вашу первую проблему. Извлекая то, что выглядит как input.txt, я могу выполнить это первое выражение без исключения.

Что касается второго вопроса, ваше выражение кажется сложным. Как насчет:

b = IO.readlines("input.txt").map { |x| x.split(' ') } 

Это поможет вам «2D» массив массивов, и вам нужно будет только две нижние индексы. (Что касается вашего вопроса о том, где же дополнительный массив пришел, вы получили один из конструктора массива, один из IO.readlines, и один из векторного конструктора я думаю....)

Или, может быть:

result = [] 
IO.foreach('input.txt') { |ln| result << ln.split(' ') } 
+0

Вы правы. Во всяком случае, теперь у меня есть другая аналогичная проблема. Http://stackoverflow.com/questions/1480996/accessing-aan-array-of-vectors-trouble – gmile