Ruby/Справочник/Matrix

Материал из Викиучебника

Перейти к: навигация, поиск

Содержание

[править] Класс Matrix

Класс Matrix обеспечивает работу с математическими матрицами. В частности, реализует методы для создания матриц специального вида (нулевые, единичные, диагональные, сингулярные, вектора), арифметические и алгебраические операции над ними, а также вычисления их математических свойств (след, ранг, детерминант, обратную матрицу).

Информация
  • Хотя матрицы теоретически должны быть прямоугольными, то класс этого не отслеживает
  • Детерминант может быть неверно вычислен, если не подключена библиотека mathn (командой require 'mathn'). Эта проблема может быть исправлена в будущем

Каталог методов

Создание матрицы:

  • Matrix[*rows]
  • Matrix.[](*rows)
  • Matrix.rows(rows, copy = true)
  • Matrix.columns(columns)
  • Matrix.diagonal(*values)
  • Matrix.scalar(n, value)
  • Matrix.scalar(n, value)
  • Matrix.identity(n)
  • Matrix.unit(n)
  • Matrix.I(n)
  • Matrix.zero(n)
  • Matrix.row_vector(row)
  • Matrix.column_vector(column)

Доступ к элементам/столбцам/строкам/подматрицам матрицы:

  • [](i, j)
  • #row_size
  • #column_size
  • #row(i)
  • #column(j)
  • #collect
  • #map
  • #minor(*param)

Свойства матрицы:

  • #regular?
  • #singular?
  • #square?

Матричная арифметика:

  • *(m)
  • +(m)
  • -(m)
  • #/(m)
  • #inverse
  • #inv
  • **

Матричные функции:

  • #determinant
  • #det
  • #rank
  • #trace
  • #tr
  • #transpose
  • #t

Преобразования в другие типы данных:

  • #coerce(other)
  • #row_vectors
  • #column_vectors
  • #to_a

Строковые представления:

  • #to_s
  • #inspect

Примеси

ExceptionForMatrix ()

Методы класса

[], column_vector, columns, diagonal, identity, row_vector, rows, scalar, zero

Методы объекта

[], **, *, +, -, /, ==, clone, coerce, collect, column_size, column_vectors, column, compare_by_row_vectors, determinant, det, eql?, hash, inspect, inverse_from, inverse, inv, map, minor, rank, regular?, row_size, row_vectors, row, singular?, square?, to_a, to_s, trace, transpose, tr, t

[править] Matrix::[]


Matrix::[](*rows)    #-> matrix

Создает матрицу, где каждый из переданных аргументов *rows интерпретируется как строка (в смысле "ряд").

Matrix[[25, 93], [-1, 66]]   #-> Matrix[[25, 93], [-1, 66]]

[править] Matrix::column_vector


Matrix::column_vector(column)   #-> matrix

Создает матрицу, состоящую из одного столбца, значения которого берутся из параметра column.

Matrix.column_vector([4, 5, 6])   #-> Matrix[[4], [5], [6]]

[править] Matrix::columns


Matrix::columns(columns)

Создает матрицу, где каждый подмассив массива columns интерпретируется как столбец.

Matrix.columns([[25, 93], [-1, 66]])   #-> Matrix[[25, -1], [93, 66]]

[править] Matrix::diagonal


Matrix::diagonal(*values)   #-> matrix

Создает матрицу, в которой переданные аргументы *values расположены по главной диагонали.

Matrix.diagonal(9, 5, -3)   #-> Matrix[[9, 0, 0], [0, 5, 0], [0, 0, -3]]

[править] Matrix::identity


Matrix::identity(n)   #-> matrix

Создает единичную матрицу размерности n.

Matrix.identity(2)   #-> Matrix[[1, 0], [0, 1]]

[править] Matrix::row_vector


Matrix::row_vector(row)   #-> matrix

Создает однострочную матрицу, значения которой берутся из row.

Matrix.row_vector([4, 5, 6])   #-> Matrix[[4, 5, 6]]

[править] Matrix::rows


Matrix::rows(rows, copy = true)   #-> matrix

Создает матрицу на основании данных двумерного массива rows каждый подмассив которого интерпретируется как строка матрицы. Если опциональный параметр copy равен false, то передаваемый массив rows будет использован внутри стурктуры матрицы без предварительного копирования.

Matrix.rows([[25, 93], [-1, 66]])   #-> Matrix[[25, 93], [-1, 66]]

[править] Matrix::scalar


Matrix::scalar(n, value)   #-> matrix

Создает матрицу размером n на n, где каждый элемент главной диагонали равен value.

Matrix.scalar(2, 5)   #-> Matrix[[5, 0], [0, 5]]

[править] Matrix::zero


Matrix::zero(n)   #-> matrix

Создает нулевую матрицу размерностью n на n.

Matrix.zero(2)   #-> Matrix[[0, 0], [0, 0]]

[править] Matrix#*


m * other   #-> matrix

Матричное умножение.

Matrix[[2, 4], [6, 8]] * Matrix.identity(2)   #-> Matrix[[2, 4], [6, 8]]

[править] Matrix#**


m ** n   #-> matrix

Матричное возведение в степень. Эквивалентно перемножению матрицы саму на себя n-раз.

Matrix[[7,6], [3,9]] ** 2   #-> Matrix[[67, 96], [48, 99]]
⚠
Работает только для целочисленных степеней n, то есть n должен быть подклассом Integer

[править] Matrix#+


m + other   #-> matrix

Матричное сложение.

Matrix.scalar(2, 5) + Matrix[[1, 0], [-4, 7]]   #-> Matrix[[6, 0], [-4, 12]]

[править] Matrix#-


m - other   #-> matrix

Матричное вычитание.

Matrix[[1, 5], [4, 2]] - Matrix[[9, 3], [-4, 1]]   #-> Matrix[[-8, 2], [8, 1]]

[править] Matrix#/


m / other   #-> matrix

Матричное деление (то есть умножение на обратную матрицу).

Matrix[[7, 6], [3, 9]] / Matrix[[2, 9], [3, 1]]   #-> Matrix[[-7, 1], [-3, -6]]

[править] Matrix#==


m == other   #-> matrix

Возвращает true, если в матрицах m и other соотвествующие элементы равны.

Matrix[[7,6], [3,9]] == Matrix[[7,6], [3,9]]      #-> true
Matrix[[14,12], [6,18]] == Matr ix[[7,6], [3,9]]   #-> false
Информация

Методы == и eql? — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#[]


m[i,j]   #-> numeric

Возвращает элемент матрицы с индексами (i, j), где i — номер строки, а j — номер столбца.

[править] Matrix#clone


m.clone   #-> matrix

Возвращает дубликат матрицы, такой, что каждый из элементов матрицы также дублируется.

[править] Matrix#coerce


m.coerce(other)   #-> array

Возвращает массив, в котором other преобразован к классу Matrix::Scalar, а второй элемент — исходная матрица m.

Matrix[[14,12], [6,18]].coerce 5
   #-> [#<Matrix::Scalar:0xc6d7048 @value=5>, Matrix[[14, 12], [6, 18]]]
Matrix[[14,12], [6,18]].coerce 12.2
   #-> [#<Matrix::Scalar:0xc6c9664 @value=12.2>, Matrix[[14, 12], [6, 18]]]

[править] Matrix#collect


m.collect{|e| ... }   #-> matrix

Возвращает матрицу, в которой все элементы преобразованы по правилу, описанному в блоке данного итератора.

Matrix[ [1,2], [3,4] ].collect { |i| i**2 }   #-> Matrix[[1, 4], [9, 16]]
Информация

Методы map и collect — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#column


m.column(j)             #-> vector
m.column(j){|e| ... }   #-> 0

Возвращает столбец j матрицы m в виде объекта класса Vector (нумерация столбцов начинается с 0, как в массивах). Если используется вызов метода с блоком, то метод вызывает блок для каждого элемента полученного вектора и возвращает 0 (что вопиюще неверно и должно быть исправлено).

Информация

Полезно посмотреть на метод row, который имеет схожую функциональность

[править] Matrix#column_size


m.column_size   #-> integer

Возвращает число столбцов матрицы m. Заметим, что метод можно вызвать для матрицы с неравным количеством столбцов (то есть Matrix[ [1,2,3], [4,5] ]), но это будет математически неверно. Метод возвращает количество столбцов первой строки (то есть с индексом 0) в качестве результата.

Matrix[[1, 2, 3], [4, 5]].column_size   #-> 3
Matrix[[1, 2], [3, 4, 5]].column_size   #-> 2
Информация

Полезно посмотреть на метод row_size, который имеет схожую функциональность

[править] Matrix#column_vectors


m.column_vectors   #-> array

Возвращает массив столбцов матрицы в виде векторов.

Информация

Полезно посмотреть на метод row_vectors, который имеет схожую функциональность

[править] Matrix#compare_by_row_vectors


m.compare_by_row_vectors(rows)   #-> true или false

Используется внутри библиотеки mathn.rb для выполнения сравнения матриц (в методах == и eql?). Параметр rows -- это двумерный массив элементов (который можно получить при помощи метода to_a).

m = Matrix[ [1,2], [3,4,5] ]
m.compare_by_row_vectors( [[25, 93], [-1, 66]] )   #-> false
m.compare_by_row_vectors( m.to_a )                 #-> true
m.compare_by_row_vectors( [[1, 2], [3, 4, 5]] )    #-> true
⚠
Автор метода, так и не смог решить нужно открывать его для публичного пользования или нет

[править] Matrix#det


m.det   #-> integer

Информация

Методы det и determinant — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#determinant


m.determinant   #-> integer

Возвращает детерминант матрицы m. Если матрица m не является квадратной, то возвращает 0.

Matrix[[7,6], [3,9]].determinant   #-> 63
Информация

Методы det и determinant — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#eql?


m.eql?(other)   #-> true или false

Возвращает true, если в матрицах m и other соотвествующие элементы равны.

[править] Matrix#hash


m.hash   #-> fixnum

Возвращает контрольную сумму для матрицы m.

[править] Matrix#inspect


m.inspect   #-> string

Переопределяет метод Object#inspect.

[править] Matrix#inv


m.inv   #-> matrix

Информация

Методы inv и inverse — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#inverse


m.inverse   #-> matrix

Возвращает обратную матрицу для матрицы m.

Matrix[[1, 2], [2, 1]].inverse   #-> Matrix[[-1, 1], [0, -1]]
Информация

Методы inv — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#inverse_from


m.inverse_from(src)   #-> matrix

Используется внутри библиотеки matrix.rb для вычисления обратной матрицы. Но зачем использовать именно его, если есть inv, который гораздо удобнее (и короче)?

m = Matrix[[1, 2], [2, 1]]
m.inv                                  #-> Matrix[[-1, 1], [0, -1]]
Matrix.I(m.row_size).inverse_from(m)   #-> Matrix[[-1, 1], [0, -1]]
Информация

Полезно посмотреть на методы inv и inverse, которые имеют схожую функциональность

⚠
Автор метода, так и не смог решить нужно открывать его для публичного пользования или нет

[править] Matrix#map


m.map{|e| ... }   #-> matrix

Информация

Методы map и collect — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#minor


m.minor(*param)   #-> matrix

Возвращает подматрицу матрицы m, где координаты задаются следующим образом:

  • start_row, nrows, start_col, ncols (координата и отклонение по каждому измерению)
  • col_range, row_range (через диапазоны)
Matrix.diagonal(9, 5, -3).minor(0..1, 0..2) #-> Matrix[[9, 0, 0], [0, 5, 0]]

[править] Matrix#rank


m.rank   #-> integer

Возвращает ранг матрицы m. Отерегайтесь использовать для матриц с действительными числами, так как из-за погрешности вычислений ранг может быть вычислен неверно. Лучше используйте рациональные числа, если это возможно.

Matrix[[7,6], [3,9]].rank   #-> 2

[править] Matrix#regular?


m.regular?   #-> true или false

Возвращает true, если m является невырожденной матрицей.

Matrix[[1]].regular?          #-> true
Matrix[[1,2]].regular?        #-> false
Matrix[[1,2],[3,4]].regular?  #-> true
Matrix[[1,2],[3]].regular?    #-> NoMethodError
Информация

Полезно посмотреть на метод singular?, который имеет схожую функциональность

⚠
Данный метод не работает с матрицами в которых строки имеют различную длину

[править] Matrix#row


m.row(i)             #-> vector
m.row(i){|e| ... }   #-> 0

Возвращает строку i матрицы m в виде объекта класса Vector (нумерация строк начинается с 0, как в массивах). Если используется вызов метода с блоком, то метод вызывает блок для каждого элемента полученного вектора и возвращает 0 (что вопиюще неверно и должно быть исправлено).

Информация

Полезно посмотреть на метод column, который имеет схожую функциональность

[править] Matrix#row_size


m.row_size   #-> integer

Возвращает количество строк матрицы m.

Информация

Полезно посмотреть на метод column_size, который имеет схожую функциональность

[править] Matrix#row_vectors


m.row_vectors   #-> array

Возвращает массив строк матрицы в виде векторов.

Информация

Полезно посмотреть на метод column_vectors, который имеет схожую функциональность

[править] Matrix#singular?


m.singular?   #-> true или false

Возвращает true, если m является невырожденной матрицей.

Matrix[[1]].singular?          #-> false
Matrix[[1,2]].singular?        #-> true
Matrix[[1,2],[3,4]].singular?  #-> false
Matrix[[1,2],[3]].singular?    #-> NoMethodError
Информация

Полезно посмотреть на метод regular?, который имеет схожую функциональность

⚠
Данный метод не работает с матрицами в которых строки имеют различную длину

[править] Matrix#square?


m.square?   #-> true или false

Возвращает true, если m является квадратной матрицей (то есть число строк в которой равняется количеству столбцов).

Matrix[[1]].square?          #-> true
Matrix[[1,2]].square?        #-> false
Matrix[[1,2],[3,4]].square?  #-> true
Matrix[[1,2],[3]].square?    #-> true
⚠
Данный метод выдает ошибочные данные для матриц, которые имею строки различной длины. Это связано со спецификой работы метода column_size

[править] Matrix#t


m.t   #-> matrix

Информация

Методы t и transpose — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#to_a


m.to_a   #-> array

Возвращает двумерный массив, состоящий из элементов матрицы m.

⚠
Самый полезный метод! Благодаря ему можно в любой момент преобразовать матрицу к массиву и воспользоваться его обширной библиотекой методов

[править] Matrix#to_s


m.to_s   #-> string

Переопределяет метод Object#to_s.

[править] Matrix#tr


m.tr   #-> integer

Информация

Методы tr и trace — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#trace


m.trace   #-> integer

Возвращает сумму диагональных элементов матрицы m (так называемый след матрицы).

Matrix[[7,6], [3,9]].trace   #-> 16
Информация

Методы tr и trace — абсолютно идентичны, то есть являются именами одного и того же метода

[править] Matrix#transpose


m.transpose   #-> matrix

Возвращает результат транспонирования матрицы m.

m = Matrix[[1,2], [3,4], [5,6]]
m.transpose   #-> Matrix[[1, 3, 5], [2, 4, 6]]
Информация

Методы t и transpose — абсолютно идентичны, то есть являются именами одного и того же метода