Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

 def rectangular?

arr = to_a

first = arr[0].size

arr[1..-1].all? {|x| x.size == first }

 end

end

Можно, конечно, модифицировать метод

square?
, так чтобы сначала он проверял, является ли матрица прямоугольной. В таком случае нужно будет изменить метод
column_size
, чтобы он возвращал
nil
для непрямоугольной матрицы.

Для вырезания части матрицы имеется несколько методов. Метод

row_vectors
возвращает массив объектов класса
Vector
, представляющих строки (см. обсуждение класса
Vector
ниже.) Метод
column_vectors
работает аналогично, но для столбцов. Наконец, метод
minor
возвращает матрицу меньшего размера; его параметрами являются либо четыре числа (нижняя и верхняя границы номеров строк и столбцов), либо два диапазона.

m = Matrix[[1,2,3,4],[5,6,7,8],[6,7,8,9]]

rows = m.row_vectors # Три объекта Vector.

cols = m.column_vectors # Четыре объекта Vector.

m2 = m.minor(1,2,1,2) # Matrix[[6,7,],[7,8]]

m3 = m.minor(0..1,1..3) # Matrix[[[2,3,4],[6,7,8]]

К матрицам применимы обычные операции: сложение, вычитание, умножение и деление. Для выполнения некоторых из них должны соблюдаться ограничения на размеры матриц-операндов; в противном случае будет возбуждено исключение (например, при попытке перемножить матрицы размерностей 3x3 и 4x4).

Поддерживаются стандартные преобразования:

inverse
(обращение),
transpose
(транспонирование) и
determinant
(вычисление определителя). Для целочисленных матриц определитель лучше вычислять с помощью библиотеки
mathn
(раздел 5.12).

Класс

Vector
— это, по существу, частный случай одномерной матрицы. Его объект можно создать с помощью методов
[]
или
elements
; в первом случае параметром является развернутый массив, а во втором — обычный массив и необязательный параметр
сору
(по умолчанию равный
true
).

arr = [2,3,4,5]

v1 = Vector[*arr] # Vector[2,3,4,5]

v2 = Vector.elements(arr) # Vector[2,3,4,5]

v3 = Vector.elements(arr,false) # Vector[2,3,4,5]

arr[2] = 7 # теперь v3 - Vector[2,3,7,5].

Метод

covector
преобразует вектор длины N в матрицу размерности Nx1 (выполняя попутно транспонирование).

v = Vector[2,3,4]

m = v.covector # Matrix[[2,3,4]]

Поддерживается сложение и вычитание векторов одинаковой длины. Вектор можно умножать на матрицу и на скаляр. Все эти операции подчиняются обычным математическим правилам.

v1 = Vector[2,3,4]

v2 = Vector[4,5,6]

v3 = v1 + v2 # Vector[6,8,10]

v4 = v1*v2.covector # Matrix![8,10,12],[12,15,18],[16,20,24]]

v5 = v1*5 # Vector[10,15,20]

Имеется метод

inner_product
(скалярное произведение):

v1 = Vector[2,3,4]

v2 = Vector[4,5,6]

x = v1.inner_product(v2) # 47

Дополнительную информацию о классах

Matrix
и
vector
можно найти в любом справочном руководстве, например воспользовавшись командной утилитой
ri
, или на сайте ruby-doc.org.

5.11. Комплексные числа

Стандартная библиотека

complex
предназначена для работы с комплексными числами в Ruby. Большая ее часть не требует пояснений.

Для создания комплексного числа применяется следующая несколько необычная нотация:

z = Complex(3,5) # 3+5i

Необычно в ней то, что имя метода совпадает с именем класса. В данном случае наличие скобок указывает на то, что это вызов метода, а не ссылка на константу. Вообще говоря, имена методов не похожи на константы, и я не рекомендую начинать имена методов с прописной буквы, разве что в подобных специальных случаях. (Отметим, что имеются также методы

Integer
и
Float
; вообще, имена, начинающиеся с прописной буквы, зарезервированы для методов, которые выполняют преобразование данных и аналогичные действия.)

  • Читать дальше
  • 1
  • ...
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: